手写代码实现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 授权协议,转载请注明来源,谢谢!