Promise.prototype.then()

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

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

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
then()Chrome Полная поддержка 32Edge Полная поддержка 12Firefox Полная поддержка 29IE Нет поддержки НетOpera Полная поддержка 19Safari Полная поддержка 8WebView Android Полная поддержка 4.4.3Chrome Android Полная поддержка 32Firefox Android Полная поддержка 29Opera Android Полная поддержка ДаSafari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12

Легенда

Полная поддержка  
Полная поддержка
Нет поддержки  
Нет поддержки

Смотри также