ES6 之 Promise 构造函数知识点总结 (四)
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象。
(图片来源网络,侵删)
Promise 对象有以下两个特点。
-
对象的状态不受外界影响。 Promise 对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
-
一旦状态改变,就不会再变,任何时候都可以得到这个结果。 Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected 。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
Promise 有几种静态方法和实例方法。
静态方法:
- Promise.resolve(value): 返回一个以给定值解析为成功的 Promise 对象。
- Promise.reject(reason): 返回一个由于给定原因而拒绝的 Promise 对象。
- Promise.all(iterable): 接收一个可迭代对象,所有输入的 promise 都成功时返回一个 promise,其结果为一个数组,包含所有输入 promise 的结果。如果任何一个输入 promise 失败,则立即拒绝。
- Promise.race(iterable): 接收一个可迭代对象,一旦其中一个 promise 解决或拒绝,就返回一个 promise,其结果或拒绝理由与第一个解决或拒绝的 promise 相同。
- Promise.allSettled(iterable): 接收一个可迭代对象,等待所有的 promise 都完成(无论是解决还是拒绝),然后返回一个 promise,其结果为一个数组,包含每个 promise 的状态。
实例方法(Promise.prototype):
- .then(onFulfilled, onRejected): 注册当 promise 解决或拒绝时的回调函数。onFulfilled 在 promise 成功时调用,onRejected 在 promise 失败时调用。返回一个新的 promise。
- .catch(onRejected): 添加一个处理 promise 失败情况的回调函数。返回一个新的 promise。
- .finally(onFinally): 注册一个在 promise 完成(无论成功或失败)后执行的回调函数。返回一个新的 promise。
用例:
// 使用 Promise.resolve 创建一个成功的 promise let resolvedPromise = Promise.resolve("Success"); // 使用 Promise.reject 创建一个失败的 promise let rejectedPromise = Promise.reject("Failure"); // 使用 Promise.all 等待多个 promise 完成 Promise.all([resolvedPromise, rejectedPromise]) .then(results => console.log(results)) .catch(error => console.error(error)); // 使用 Promise.race 等待最快完成的 promise Promise.race([resolvedPromise, rejectedPromise]) .then(value => console.log(value)) .catch(error => console.error(error)); // 使用 Promise.allSettled 等待所有 promise 完成,不论成功或失败 Promise.allSettled([resolvedPromise, rejectedPromise]) .then(results => console.log(results)); // 输出每个 promise 的状态 // 使用 Promise.prototype.then 注册回调 let promise = new Promise((resolve, reject) => { resolve("Done"); }); promise.then(value => { console.log(value); // 输出:Done }); // 使用 Promise.prototype.catch 处理错误 promise.then(() => { throw new Error("An error occurred"); }).catch(error => { console.error(error.message); // 输出:An error occurred }); // 使用 Promise.prototype.finally 注册最终回调 promise.finally(() => { console.log("This is the final step."); });
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。