乐趣区

关于前端:Promise-基本方法的简单实现

前言

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

catch() 办法

catch 办法是对 then 办法的封装,只用于接管 reject(reason) 中的错误信息。

因为在 then 办法中 onRejected 参数是可不传的,不传的状况下,错误信息会顺次往后传递,直到有 onRejected 函数接管为止,因而在写 promise 链式调用的时候,then 办法不传 onRejected 函数,只须要在最开端加一个 catch() 就能够了,这样在该链条中的 promise 产生的谬误都会被最初的 catch 捕捉到。

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

done() 办法

catchpromise 链式调用的开端调用,用于捕捉链条中的错误信息,然而 catch 办法外部也可能呈现谬误,所以有些 promise 实现中减少了一个办法 done

done 相当于提供了一个不会出错的 catch 办法,并且不再返回一个 promise,个别用来完结一个 promise 链。

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

finally() 办法

finally 办法用于无论是 resolve 还是 rejectfinall y 的参数函数都会被执行。

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

Promise.all() 办法

Promise.all 办法接管一个 promise 数组,返回一个新 promise2,并发执行数组中的全副 promise,所有 promise 状态都为 resolved 时,promise2 状态为 resolved 并返回全副 promise 后果,后果程序和 promise 数组程序统一。如果有一个 promiserejected 状态,则整个 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.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() 和 Promise.reject()

Promise.resolve 用来生成一个 rejected 实现态的 promisePromise.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 办法实现。

~

~ 本文完,感激浏览!

~

学习乏味的常识,结识乏味的敌人,塑造乏味的灵魂!

大家好,我是〖编程三昧〗的作者 隐逸王 ,我的公众号是『编程三昧』,欢送关注,心愿大家多多指教!

退出移动版