Метод then()
возвращает Promise
. Метод может принимать два аргумента: колбэк-функции для случаев выполнения и отклонения промиса.
Если один или оба аргумента отсутсвуют или их значения не функции, то then
пропустит их и не выбросит ошибку. Если для Promise
, который переходит в состояние выполнен
или отклонен
вызван метод then
, и у данного метода нет нужного обработчика, то в таком случае then
просто возвращает промис с состоянием начального Promise
, для которого then
был вызван.
Синтаксис
p.then(onFulfilled[, onRejected]); p.then(value => { // выполнение }, reason => { // отклонение });
Параметры
onFulfilled
НеобязательныйFunction
вызывается, когдаPromise
выполнен. Эта функция принимает один аргумент, значение с которым промис был выполнен. Если значение onFulfilled не функция, то оно автоматически заменяется на "Identity" функцию (возвращает полученный аргумент)onRejected
НеобязательныйFunction
вызывается, когдаPromise
отклонен. Эта функция принимает один аргумент, значение с которым промис был отклонен. Если значение onRejected не функция, то оно автоматически заменяется на "Thrower" функцию (выбрасывает полученный аргумент как ошибку)
Описание
Так как и метод 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. |
Совместимость с браузерами
BCD tables only load in the browser