1. 程式人生 > >迴圈裡面巢狀一個非同步請求,所有迴圈執行完畢後再返回請求的資料

迴圈裡面巢狀一個非同步請求,所有迴圈執行完畢後再返回請求的資料

場景介紹:

使用es6實現爬蟲,先遍歷完列表,然後迴圈列表的根據url去查詢每篇文章的詳細內容,最後將所有爬取完的資料寫入資料庫(只寫一次,避免資料庫頻繁的開啟的關閉,影響效能)。

原始實現方式和痛點分析:

var list =["url1","url2","url3",.....];

for(let i = 0;i< list.length;i++){

  $.ajax(list[i],function(data){

       console.log("success");

        //data是執行成功後獲取到的url1對應的文章詳細內容

       //第一次查詢完成後就必須把該資料寫到資料庫中,這樣太影響效能

       dataBase.writeDB(data);

 },"json")

}

思考:

能否在for迴圈完成後將所有文章的詳細內容返回,然後統一寫進資料庫?

實現一個公共類:

iteratorArr: function(arr, promiseCallback) {
        var it = arr[Symbol.iterator]();
        var list = [];

        return x(it.next());

        function x(item) {
            if (item.done) {
                return Promise.resolve(list);
            }
            return promiseCallback(item.value).then(function(value) {
                return list.push(value);
            }).then(function() {
                return x(it.next());
            }).catch(Promise.reject)
        }
    }

測試:

     $("#test").click(function(){
        var arr = [1,2,3,4,5];

       //呼叫上面的公共類
        helper.iteratorArr(arr,promiseCallBack).then(function(list){
            console.log("_----------------------------------0");
            console.log(list);
        });
    })
    function promiseCallBack(){
        return new Promise((resolve,reject)=>{
            setTimeout(resolve,2000,'done');
        })
    }

結果: