一、什么是 Promise?
Promise
是 ES6 引入的一种异步编程解决方案,用于避免「回调地狱」问题。它表示一个可能还未完成但将来会完成的操作,其主要作用是用于异步操作的结果管理。
二、Promise 的三种状态
-
pending(进行中):初始状态。
-
fulfilled(已成功):操作成功完成,并返回一个结果。
-
rejected(已失败):操作失败,并返回一个原因(错误信息)。
状态一旦变更,就不可再改变(不可逆)。
三、Promise 基本语法
const promise = new Promise((resolve, reject) => {
// 异步操作
if (成功) {
resolve(value); // 变为 fulfilled 状态
} else {
reject(reason); // 变为 rejected 状态
}
});
四、常用方法详解
(一).then()
: 处理成功或失败(注册两个回调)。
myPromise.then( onFulfilled, // (value) => { ... } 成功时的处理函数,接收决议值
onRejected // (reason) => { ... } 失败时的处理函数(可选),接收拒绝原因 );
一般来说用.catch代替onRejected函数,.catch放在链式调用末尾,捕获前面任何一个 then 或 executor 中的错误
1 可以只传 onFulfilled
,或只传 onRejected
(但通常用 .catch
更好)。
2 返回新 Promise: .then
方法总是返回一个新的 Promise!这是链式调用的基础。
3 如果处理函数返回一个值,新 Promise 以该值 resolve
。
4 如果处理函数返回另一个 Promise,新 Promise 会“跟随”那个 Promise 的状态和值。
5 如果处理函数抛出错误,新 Promise 以该错误信息reject
。
(二).catch()
:
专门处理拒绝状态(相当于 .then(null, onRejected)
)。最佳实践: 用于集中处理链中发生的任何错误。
(三).finally()
:
无论成功或失败最终都会执行的回调。不接收参数,通常用于清理工作(如隐藏加载指示器)。
myPromise .then(result =>{
... }) .catch(error =>{
... }) .finally(() =>{
console.log('Operation completed (success or failure).'); // 清理操作 });
(四)Promise.all(iterable)
:
作用: 接收一个 Promise 对象集合(如数组),当所有 Promise 都成功解决时,返回一个包含所有成功结果的数组(顺序与输入一致)。如果任何一个 Promise 被拒绝,则立即以该拒绝原因拒绝返回的 Promise。
用例: 并行执行多个独立的异步操作,并需要等待所有结果才能继续(如同时加载多个资源)。
(五)Promise.allSettled(iterable)
:
作用: (ES2020) 接收一个 Promise 对象集合,等待所有 Promise 都敲定(settled,即 fulfilled
或 rejected
)。返回一个数组,每个元素是一个对象,描述对应 Promise 的结果 { status: 'fulfilled', value: ... }
或 { status: 'rejected', reason: ... }
。
用例: 无论单个成功或失败,都需要知道所有异步操作最终结果时(如批量提交表单,需要报告每个提交的状态)。
(六) Promise.race(iterable)
:
作用: 接收一个 Promise 对象集合,返回一个新的 Promise。这个新 Promise 会采纳第一个敲定(settled)的 Promise(无论成功或失败)的状态和结果/原因。
用例: 设置超时、竞速(取最快响应的结果)。
(七)Promise.any(iterable)
作用: 接收一个可迭代对象(通常是 Promise 对象组成的数组)。它返回一个新的 Promise
-
等待第一个成功: 它会等待传入的 Promise 中任何一个率先成功解决(
fulfilled
)。一旦有第一个 Promise 成功,Promise.any()
返回的 Promise 会立即以这个成功 Promise 的结果值解决(resolve
)。 -
处理全部失败: 如果传入的所有 Promise 都被拒绝(
rejected
),那么Promise.any()
返回的 Promise 会以一个特殊的AggregateError
对象被拒绝(reject
)。这个AggregateError
对象有一个.errors
属性,它是一个数组,包含了所有传入 Promise 的拒绝原因(rejection reasons)。