Promise.prototype.then()

Метод then() возвращает Promise. Метод может принимать два аргумента: колбэк-функции для случаев выполнения и отклонения промиса.

 Если один или оба аргумента отсутствуют или их значения не функции, то then пропустит их и не выбросит ошибку. Если для Promise, который переходит в состояние выполнен или отклонён вызван метод then, и у данного метода нет нужного обработчика, то в таком случае then просто возвращает промис с состоянием начального Promise, для которого then был вызван.

Синтаксис

p.then(onFulfilled[, onRejected]);

p.then(value => {
  // выполнение
  }, reason => {
  // отклонение
});

Параметры

onFulfilled Необязательный
Function вызывается, когда Promise выполнен. Эта функция принимает один аргумент, значение с которым промис был выполнен. Если значение onFulfilled не функция, то оно автоматически заменяется на "Identity" функцию (возвращает полученный аргумент)
onRejected Необязательный
Function вызывается, когда Promise  отклонён. Эта функция принимает один аргумент, значение с которым промис был отклонён. Если значение onRejected не функция, то оно автоматически заменяется на "Thrower" функцию (выбрасывает полученный аргумент как ошибку)

Описание

Так как и метод then, и метод Promise.prototype.catch() возвращают Promise, их можно вызвать цепочкой — эта операция называется соединение.

Примеры

Использование метода then

var p1 = new Promise(function(resolve, reject) {
  resolve("Успех!");
  // или
  // reject("Ошибка!");
});

p1.then(function(value) {
  console.log(value); // Успех!
}, function(reason) {
  console.log(reason); // Ошибка!
});

Соединение

Так как метод then возвращает промис (Promise), вы можете объединить несколько вызовов then в цепочку. Значения возвращаемые из колбэков onFulfilled или onRejected будут автоматически обёрнуты в промис.

var p2 = new Promise(function(resolve, reject) {
  resolve(1);
});

p2.then(function(value) {
  console.log(value); // 1
  return value + 1;
}).then(function(value) {
  console.log(value); // 2
});

p2.then(function(value) {
  console.log(value); // 1
});

Вы также можете соединить одну функцию, имеющую подобный с промисами API, с другой функцией.

function fetch_current_data() {
  // API функции fetch() возвращает промис. Эта функция
  // имеет аналогичный API, за исключением значения в случае выполнения
  return fetch("current-data.json").then((response) => {
    if (response.headers.get("content-type") != "application/json") {
      throw new TypeError();
    }
    var j = response.json();
    // можем что-нибудь делать с j
    return j; // в случае выполнения промиса, значение
              // передаётся в fetch_current_data().then()
  });
}

Если onFulfilled возвращает промис, возвращаемое значение может быть выполнено (resolved) / отклонено (rejected) промисом.

function resolveLater(resolve, reject) {
  setTimeout(function () {
    resolve(10);
  }, 1000);
}
function rejectLater(resolve, reject) {
  setTimeout(function () {
    reject(20);
  }, 1000);
}

var p1 = Promise.resolve("foo");
var p2 = p1.then(function() {
  // Возвращает промис, который будет разрешен значением 10 через 1 секунду
  return new Promise(resolveLater);
});
p2.then(function(v) {
  console.log("resolved", v);  // "resolved", 10
}, function(e) {
  // не вызвано
  console.log("rejected", e);
});

var p3 = p1.then(function() {
// Возвращает промис, который будет отброшен значением 20 через 1 секунду
  return new Promise(rejectLater);
});
p3.then(function(v) {
  // не
  console.log("resolved", v);
}, function(e) {
  console.log("rejected", e); // "rejected", 20
});

Спецификация

Спецификация Статус Комментарий
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Promise.prototype.then' в этой спецификации.
Стандарт Изначальное определение в стандарте ECMA.

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также