亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 1220 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號