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 July 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® 2026 Language Specification # sec-promise.prototype.then |