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