Bootstrap

Promise 基本方法的简单实现

前言

Promise 是前端面试和工作中极其常见的一个概念,关于它各种方法的手写实现也很有市场,今天在这里总结一下 Promise 基本方法的简单实现。

catch() 方法

方法是对 方法的封装,只用于接收 中的错误信息。

因为在 方法中 参数是可不传的,不传的情况下,错误信息会依次往后传递,直到有 函数接收为止,因此在写 链式调用的时候, 方法不传 函数,只需要在最末尾加一个 就可以了,这样在该链条中的 发生的错误都会被最后的 捕获到。

catch(onRejected) {
  return this.then(null, onRejected);
}

done() 方法

在 链式调用的末尾调用,用于捕获链条中的错误信息,但是 方法内部也可能出现错误,所以有些 实现中增加了一个方法 。

相当于提供了一个不会出错的 方法,并且不再返回一个 ,一般用来结束一个 链。

done() {
    this.catch(reason => {
        console.log('done', reason);
        throw reason;
    });
}

finally() 方法

方法用于无论是 还是 , y的参数函数都会被执行。

finally(fn) {
    return this.then(value => {
        fn();
        return value;
    }, reason => {
        fn();
        throw reason;
    });
};

Promise.all() 方法

方法接收一个 数组,返回一个新 ,并发执行数组中的全部 ,所有 状态都为 时, 状态为 并返回全部 结果,结果顺序和 数组顺序一致。如果有一个 为 状态,则整个 进入 状态。

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() 方法

方法接收一个 数组, 返回一个新 ,顺序执行数组中的 ,有一个 状态确定, 状态即确定,并且同这个 的状态一致。

static race(promiseList) {
    return new Promise((resolve, reject) => {
        for (const p of promiseList) {
            p.then((value) => {
                resolve(value);
            }, reject);
        }
    });
}

Promise.resolve() 和 Promise.reject()

用来生成一个 完成态的 , 用来生成一个 失败态的 。

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);
    });
}

总结

常用的方法基本就这些, 还有很多扩展方法,这里就不一一展示,基本上都是对 方法的进一步封装,只要你的 方法没有问题,其他方法就都可以依赖 方法实现。

~

~ 本文完,感谢阅读!

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好,我是〖〗的作者 隐逸王,我的公众号是『』,欢迎关注,希望大家多多指教!