如何手写一个 Promise.all

Promise.all的完成体应该符合以下特征:

  1. 输入为Iterator类型的参数,可以是ArrayMapSetString ,可能也得包括魔改的IteratorSymbol.iterator)之类
  2. 若输入的可迭代数据里不是Promise,则也需要原样输出
  3. 返回一个Promise实例,可以调用thencatch方法
  4. 输出在then里体现为保持原顺序的数组
  5. 输出在catch体现为最早的reject返回值
  6. Iteratorresolve返回空数组

 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对象,从而控制异步流程。

 

posted @   不特别但唯一  阅读(306)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示