如何手写一个 Promise.all
Promise.all的完成体应该符合以下特征:
- 输入为Iterator类型的参数,可以是Array,Map, Set,String ,可能也得包括魔改的Iterator(Symbol.iterator)之类
- 若输入的可迭代数据里不是Promise,则也需要原样输出
- 返回一个Promise实例,可以调用then和catch方法
- 输出在then里体现为保持原顺序的数组
- 输出在catch体现为最早的reject返回值
- 空 Iterator, resolve返回空数组
function all(iterArr){
let results=[];//所有数据resolve之后,返回的结果存在results
return new Promise((resolve,reject)=>{
for(let i=0;i<iterArr.length;i++){
Promise.resolve(iterArr[i]).then(res=>{
results[i]=res;
if(results.length===iterArr.length){
resolve(results);
}
}).catch(e=>reject(e)) //当发生异常时,直接reject
}
})
}
let p1 = Promise.resolve(3);
let p2 = 1337;
let p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
all([10, 11, 12]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
Promise.resolve()用于将现有对象转换为Promise对象,从而控制异步流程。

浙公网安备 33010602011771号