迴圈裡面巢狀一個非同步請求,所有迴圈執行完畢後再返回請求的資料
場景介紹:
使用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');
})
}
結果: