MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

Метод 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.

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

Возможность 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,