导读:Promise 是异步编程的一种解决方案,比传统的回调函数或事件更合理和更灵活。本文主要展示 Promise 提供的方法列表,以及基本的实现原理。通过本文,我们能加深 Promise 方法的理解和场景使用,对 Promise.all、Promise.race、Promise.allSettled 和 Promise.any 四个方法的异同之处也有更深层次的领悟。
一、Promise 方法列表
Promise 的实例方法有 then/catch/finally 三种,静态方法有 all/race/allSettled/any/resolve/reject 六种。其中 then 实现起来因为涉及 Promise 裁决过程(The Promise Resolution Procedure),会比较复杂,其余的都是基于已有功能的拓展。下面都给大伙列出所有的方法。
Promise.prototype.then()
Promise.prototype.catch()
Promise.prototype.finally()
Promise.all()
Promise.race)
Promise.allSettled)
Promise.any()
Promise.resolve()
Promise.reject()
二、Promise 九种方法实现
1. 原型方法 then
then 方法是整个 Promise 解决的核心内容,同时因为回调函数和返回一个新的 Promise 实例,因此决议过程比较复杂。这里也是直接说明 then 方法的定义,具体可以看一篇文章手写一个 Promises/A+和理解核心概念
// class MyPromise {
// static PENDING = 'pending'; // 进行中
// static FULFILLED = 'fulfilled'; // 已成功
// static REJECTED = 'rejected'; // 已失败
// state = MyPromise.PENDING;
// value = null;
// reason = null;
// onFulfilledCallbacks = [];
// onRejectedCallbacks = [];
// ...
// }
MyPromise.prototype.then = (onFulfilled, onRejected) => {
if (typeof onFulfilled != 'function') {
onFulfilled = (value) => value;
}
if (typeof onRejected != 'function') {
onRejected = (reason) => {
throw reason;
};
}
// Promise 核心解决过程 见规范2.3
const _resolvePromise = (promise, x, resolve, reject) => {
// 2.3.1 如果 promise 和 x 指向同一对象,抛出 TypeError 错误
if (promise === x) {
const errMsg = 'The promise and the return value are the same';
return reject(ne