
Promise 是前端面试和工作中极其常见的一个概念,关于它各种方法的手写实现也很有市场,今天在这里总结一下 Promise 基本方法的简单实现。
catch 方法是对 then 方法的封装,只用于接收 reject(reason) 中的错误信息。
因为在 then 方法中 onRejected 参数是可不传的,不传的情况下,错误信息会依次往后传递,直到有 onRejected 函数接收为止,因此在写 promise 链式调用的时候, then 方法不传 onRejected 函数,只需要在最末尾加一个 catch() 就可以了,这样在该链条中的 promise 发生的错误都会被最后的 catch 捕获到。
catch(onRejected) {    return this.then(null, onRejected);}catch 在 promise 链式调用的末尾调用,用于捕获链条中的错误信息,但是 catch 方法内部也可能出现错误,所以有些 promise 实现中增加了一个方法 done 。
done 相当于提供了一个不会出错的 catch 方法,并且不再返回一个 promise ,一般用来结束一个 promise 链。
done() {    this.catch(reason => {        console.log('done', reason);        throw reason;    });}finally 方法用于无论是 resolve 还是 reject , finall y的参数函数都会被执行。
finally(fn) {    return this.then(value => {        fn();        return value;    }, reason => {        fn();        throw reason;    });};Promise.all 方法接收一个 promise 数组,返回一个新 promise2 ,并发执行数组中的全部 promise ,所有 promise 状态都为 resolved 时, promise2 状态为 resolved 并返回全部 promise 结果,结果顺序和 promise 数组顺序一致。如果有一个 promise 为 rejected 状态,则整个 promise2 进入 rejected 状态。
static all(promiseList) {    return new Promise((resolve, reject) => {        const result = [];        let i = 0;        for (const p of promiseList) {            p.then(value => {                result[i] = value;                if (result.length === promiseList.length) {                    resolve(result);                }            }, reject);            i++;        }    });}Promise.race 方法接收一个 promise 数组, 返回一个新 promise2 ,顺序执行数组中的 promise ,有一个 promise 状态确定, promise2 状态即确定,并且同这个 promise 的状态一致。
static race(promiseList) {    return new Promise((resolve, reject) => {        for (const p of promiseList) {            p.then((value) => {                resolve(value);            }, reject);        }    });}Promise.resolve 用来生成一个 rejected 完成态的 promise , Promise.reject 用来生成一个 rejected 失败态的 promise 。
static resolve(value) {    let promise;    promise = new Promise((resolve, reject) => {        this.resolvePromise(promise, value, resolve, reject);    });    return promise;}static reject(reason) {    return new Promise((resolve, reject) => {        reject(reason);    });}常用的方法基本就这些, Promise 还有很多扩展方法,这里就不一一展示,基本上都是对 then 方法的进一步封装,只要你的 then 方法没有问题,其他方法就都可以依赖 then 方法实现。
~
~ 本文完,感谢阅读!
~
学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号