为了账号安全,请及时绑定邮箱和手机立即绑定

Promise并发请求,单个请求完毕后立刻处理请求

Promise并发请求,单个请求完毕后立刻处理请求

Helenr 2019-02-16 19:12:22
getJSON('xxxx').then(function(response) {  return Promise.all(response.results.map(getJSON));}).then(function(series) {  series.forEach(addDom);});其中getJSON() 是fetch请求,response.results是url的数组,addDom()是对数据的操作;这段代码实现了:1.url并发请求 2.不同请求的数据顺序操作但问题是所有请求全部加载完成后再处理数据,如何实现当前顺序的数据加载完成后就立刻对其处理而不等待其他数据
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

写了个例子,可以在chrome的控制台里直接执行


(()=>{

    Promise.allInOrder = (promises, thenForEach)=>{

        let callBackQueue = new Array(promises.length);

        let thenCallbackQueue = new Array(promises.length);


        let queueExecutor = ()=>{

            for(let i=0,l=callBackQueue.length;i<l;i++){

                if(callBackQueue[i] == void(0)){

                    // undefined means this task is not done yet

                    return;

                }else{

                    // execute callback

                    callBackQueue[i]();


                    // set this callback to null since it has been executed

                    callBackQueue[i] = ()=>{};

                }

            }

            // when reach here, it means all callbacks been executed

            Promise.all(thenCallbackQueue).then(ds=>{

                allPromiseResolver(ds);

            });

        };


        let allPromiseResolver = null, 

            allPromiseRejector = null;


        for(let i=0,l=promises.length;i<l;i++){


            promises[i].then(d=>{

                callBackQueue[i] = function(){

                    thenCallbackQueue[i] = new Promise((resolve, reject)=>{

                        let result = thenForEach(d);

                        resolve(result);

                    });

                };


                queueExecutor();

            });

        }


        return {

            all: callback=>{

                return new Promise((resolve, reject)=>{

                    allPromiseResolver = resolve;

                    allPromiseRejector = reject;

                }).then(ds=>{

                    callback(ds);

                });

            }

        }

    };

})();


// test

(()=>{

    let timeConsumingFunc = param=>new Promise(

            (resolve)=>{

                let timeout = Math.random() * 5000;

                console.log(`task ${param} will be resolved in ${timeout}ms`);

                setTimeout(()=>{

                    console.log(`${param} resolved`);

                    resolve(param+10);

                }, timeout);

            }

        );

    Promise

        .allInOrder(

            [timeConsumingFunc(1), timeConsumingFunc(2), timeConsumingFunc(3)],

            d=>{

                console.log(d);

                return d+20;

            }

        )

        .all((ds)=>{console.log(`all method called`);console.log(ds);})

})();


查看完整回答
反对 回复 2019-02-21
  • 1 回答
  • 0 关注
  • 1203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信