Promise.prototype.then()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
ÐеÑод 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
},
);
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification > # sec-promise.prototype.then > |