手写代码实现Promise.all。
Promise.all()方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例, 那个输入的所有promise的resolve回调的结果是一个数组。这个Promise的resolve回调执行是在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候。它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的是第一个抛出的错误信息。
接收一个promises数组,获取它的长度,记录已经完成的Promise数量和结果,返回一个Promise对象,当promises中所有的Promise都完成时返回结果数组,对所有Promise遍历执行,当其完成时使得完成的Promise数量增加即可,当出现rejected时直接reject。
function myAll(promises) {
const len = promises.length;
const result = new Array(len);
let doneCnt = 0;
return new Promise((resolve, reject) => {
if (len == 0) {
resolve(result);
}
for (let i = 0; i < len; i++) {
Promise.resolve(promises[i]).then(
(data) => {
result[i] = data;
doneCnt++;
if (doneCnt == len) {
resolve(result);
}
},
(err) => reject(err)
);
}
});
}
Promise.myAll = myAll;
本文作者:TTQ
本文链接:https://blog.ponder.fun/archives/145.html
最后修改时间:2022-04-22 21:59:10
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!