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

Синтаксис

p.then(onFulfilled, onRejected);

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

Параметры

onFulfilled
Function вызывается, когда Promise (обещание) выполнено. Эта функция принимает один аргумент, значение с которым промис был выполнен.
onRejected
Function вызывается, когда Promise (обещание) отклонено. Эта функция принимает один аргумент, значение с которым промис был отклонен.

Описание

Так как и метод 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.

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

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка 32 29.0 (29.0) [1] Нет 19 7.1
Возможность Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Базовая поддержка Нет 29.0 (29.0) [1] Нет Нет 8 32

[1] В Gecko 24 есть экспериментальная реализация Promise под предварительным именем Future. В Gecko 25 ей дано текущее название, но её поддержка по умолчанию отключена, за это отвечает флаг dom.promise.enabled. После исправления Bug 918806 в Gecko 29 обещания работают по умолчанию.

Смотри также

Метки документа и участники

Внесли вклад в эту страницу: Kesantielu, andreymir, AlexKhram, LeoVS09, ksladkov
Обновлялась последний раз: Kesantielu,