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?