手动实现Promise.all()
Promise.all()
方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
Promise.all()
方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。如果有成员不是Promise实例,就会先调用下面讲到的Promise.resolve
方法,将参数转为 Promise 实例,再进一步处理。
我们来实现一下
function Promiseall(promises){ const iterator=Symbol.iterator if(!promises[iterator])return; return new Promise((resolve,reject)=>{ const resolvearr=[]; const rejectarr=[]; for(let i of promises){ if(!(i instanceof Promise)){ i=Promise.resolve(i) } i.then(res=>{ resolvearr.push(res) }) .catch(err=>{ rejectarr.push(err) }) } setTimeout(()=>{ return rejectarr.length===0?resolve(resolvearr):reject(rejectarr[0]) }) }) } const p1=new Promise(res=>res(1)) const p2=new Promise((res,rej)=>rej(2)) const p3=new Promise((res,rej)=>rej(3)) const p4=‘4‘ const su=x([p1,p2,p3,p4]) su.then(res=>{ console.log(res) }) .catch(res=>{ console.log(res) })
相关推荐
89500297 2020-04-29
nmgxzm00 2020-11-10
xixixi 2020-11-11
88254251 2020-11-01
MarukoMa 2020-09-02
88234852 2020-09-15
陈旭阳 2020-08-31
whynotgonow 2020-08-19
前端开发Kingcean 2020-07-30
whynotgonow 2020-07-29
bowean 2020-07-08
前端开发Kingcean 2020-07-08
88520191 2020-07-05
前端开发Kingcean 2020-06-27
88481456 2020-06-18
whynotgonow 2020-06-16
88520191 2020-06-13
88520191 2020-06-13