Promise
是 JavaScript 中用于处理异步操作的对象。它表示一个异步操作的最终完成(或失败)及其结果值。Promise
提供了一种更优雅的方式来处理异步代码,避免了传统的回调地狱(Callback Hell)。
Promise 的三种状态
- Pending(等待中):
- 初始状态,既没有被兑现(fulfilled),也没有被拒绝(rejected)。
- Fulfilled(已兑现):
- 表示操作成功完成,此时会调用
then
方法中的成功回调。
- 表示操作成功完成,此时会调用
- Rejected(已拒绝):
- 表示操作失败,此时会调用
then
方法中的失败回调或catch
方法。
- 表示操作失败,此时会调用
创建 Promise
Promise
的构造函数接受一个函数(通常称为执行器函数),该函数有两个参数:resolve
和 reject
。
resolve
:将Promise
的状态从pending
变为fulfilled
,并传递结果值。reject
:将Promise
的状态从pending
变为rejected
,并传递错误原因。
示例:
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) {
resolve("Operation succeeded!");
} else {
reject("Operation failed!");
}
}, 1000);
});
promise
.then((result) => console.log(result)) // 输出 "Operation succeeded!"
.catch((error) => console.error(error));
Promise 的链式调用
Promise
支持链式调用,可以通过 then
方法依次处理多个异步操作。
示例:
const fetchData = () => {
return new Promise((resolve) => {
setTimeout(() => resolve("Data fetched!"), 1000);
});
};
const processData = (data) => {
return new Promise((resolve) => {
setTimeout(() => resolve(`${data} -> Processed!`), 1000);
});
};
fetchData()
.then((data) => processData(data))
.then((result) => console.log(result)) // 输出 "Data fetched! -> Processed!"
.catch((error) => console.error(error));
Promise 的静态方法
-
Promise.resolve()
:-
返回一个已经成功(fulfilled)的
Promise
对象。 -
示例:
Promise.resolve("Resolved!").then((result) => console.log(result)); // 输出 "Resolved!"
-
-
Promise.reject()
:-
返回一个已经失败(rejected)的
Promise
对象。 -
示例:
Promise.reject("Rejected!").catch((error) => console.error(error)); // 输出 "Rejected!"
-
-
Promise.all()
:-
接收一个
Promise
数组,当所有Promise
都成功时返回一个包含所有结果的数组;如果任何一个Promise
失败,则立即返回失败的结果。 -
示例:
const promises = [ Promise.resolve(1), Promise.resolve(2), Promise.resolve(3), ]; Promise.all(promises) .then((results) => console.log(results)) // 输出 [1, 2, 3] .catch((error) => console.error(error));
-
-
Promise.race()
:-
接收一个
Promise
数组,返回第一个完成(无论成功或失败)的Promise
的结果。 -
示例:
const promises = [ new Promise((resolve) => setTimeout(() => resolve("First"), 1000)), new Promise((resolve) => setTimeout(() => resolve("Second"), 2000)), ]; Promise.race(promises).then((result) => console.log(result)); // 输出 "First"
-
-
Promise.allSettled()
:-
接收一个
Promise
数组,等待所有Promise
完成(无论成功或失败),并返回一个包含每个Promise
结果的对象数组。 -
示例:
const promises = [ Promise.resolve(1), Promise.reject("Error"), Promise.resolve(3), ]; Promise.allSettled(promises).then((results) => console.log(results)); // 输出: // [ // { status: 'fulfilled', value: 1 }, // { status: 'rejected', reason: 'Error' }, // { status: 'fulfilled', value: 3 } // ]
-
-
Promise.any()
:-
接收一个
Promise
数组,返回第一个成功的Promise
的结果。如果所有Promise
都失败,则返回一个AggregateError
。 -
示例:
const promises = [ Promise.reject("Error 1"), Promise.resolve("Success!"), Promise.reject("Error 2"), ]; Promise.any(promises) .then((result) => console.log(result)) // 输出 "Success!" .catch((error) => console.error(error));
-
Promise 的实例方法
-
then()
:-
用于为
Promise
添加成功(fulfilled)或失败(rejected)状态的回调函数。 -
示例:
promise.then( (result) => console.log(result), // 成功回调 (error) => console.error(error) // 失败回调 );
-
-
catch()
:-
用于捕获
Promise
的失败状态(rejected)。 -
示例:
promise.catch((error) => console.error(error));
-
-
finally()
:-
无论
Promise
是成功还是失败,都会执行的回调函数。 -
示例:
promise.finally(() => console.log("Done!"));
-
总结
方法类型 | 方法名 | 描述 |
---|---|---|
实例方法 | then() | 添加成功或失败的回调函数 |
实例方法 | catch() | 捕获失败状态 |
实例方法 | finally() | 无论成功或失败都会执行的回调函数 |
静态方法 | Promise.resolve() | 返回一个成功的 Promise |
静态方法 | Promise.reject() | 返回一个失败的 Promise |
静态方法 | Promise.all() | 等待所有 Promise 成功,或第一个失败 |
静态方法 | Promise.allSettled() | 等待所有 Promise 完成(无论成功或失败) |
静态方法 | Promise.race() | 返回第一个完成的 Promise (无论成功或失败) |
静态方法 | Promise.any() | 返回第一个成功的 Promise ,如果全部失败则返回 AggregateError |
Promise
是 JavaScript 中处理异步操作的核心工具。它通过链式调用和状态管理,使得异步代码更易读、更易维护。结合 async/await
语法,可以进一步简化异步代码的编写。