06. Chaining Promises
Given two Promises P
and Q
, the following code produces a new Promise that executes Q
after P
is fulfilled:
P.then(() => Q);
Note that this is similar to the semicolon for synchronous code: Sequential composition of the synchronous operations f()
and g()
looks as follows:
f();
g();
Если результатом выполнения P.then(onFulfilled, onRejected)
является новый объект Promise Q
, то на нем можно продолжать вычисления, вызывая Q.then(onFulfilled, onRejected)
.
Resolve with value
Resolve promise with a normal value:
const P = Promise.resolve("Success.");
const Q = P.then(value => {
console.log(value); // Success.
return 42;
});
Q.then(value => {
console.log(value); // 42
});
Resolve with thenable
Если возвращаемый из Promise объект R
имеет метод then
, то возвращаемый Promise Q
делегирует then
-реакцию на R
:
const P = Promise.resolve("Success.");
P.then(value => {
console.log(value); // Success.
return { then: onFulfilled => onFulfilled(42) };
})
/* Q */
.then(value => {
console.log(value); // 42
});
Resolve with error
Если значение R
возвращается из catch
то оно становится нормальным начальным значением по умолчанию для Q
:
const P = Promise.reject('Failure.');
P.catch(value => {
console.log(value); // Failure.
return 42;
});
/* Q */
.then(value => {
console.log(value); // 42
});
Выбрасываемые исключения из P
при любой реакции делегируются на Q.catch
:
const P = Promise.resolve("Success.");
const Q = P.then(value => {
console.log(value); // Success.
throw "Failure.";
});
Q.catch(value => {
console.log(value); // Failure.
});
Может быть несколько последовательных реакций then
. Тогда ошибка передается до тех пор, пока не будет найден обработчик на одном из производных Promise:
const P = Promise.resolve("Success.");
P
.then(value => {
console.log(value); // Success.
throw "Failure.";
})
.then(value => {
console.log(value);
})
.catch(value => {
console.log(value); // Failure.
});
Last updated
Was this helpful?