Метод 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 обещания работают по умолчанию.