手动实现Promise.all()

Posted ayujun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手动实现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)
})

 

以上是关于手动实现Promise.all()的主要内容,如果未能解决你的问题,请参考以下文章

什么时候然后从Promise.all()的子句运行?

使用 Promise.all 时承诺之间的延迟

使用 Promise.all() 在 Promise 实现时执行操作

Promise.all 的顺序执行

假设把官方的promise.all去掉,实现自己的promise.all方法

Promise.all()函数中的JS“等待仅在异步函数中有效”[重复]