Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Promise.prototype.then()

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

Синтаксис

p.then(onFulfilled, onRejected);

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

Параметры

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

Описание

Так как и метод 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 возвращает обещание,  value может быть разрешено(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 обещания работают по умолчанию.

Смотри также

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

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