前言
本文主要給大家介紹了關于node.js多個異步過程中判斷執行是否完成的相關內容,可能這樣說大家不是很明白,下面來一起看看詳細的介紹吧。
場景:
想請求量較大的網絡數據,比如想獲取1000條結果,但數據處理速度慢,有超時的風險,可以分成10次處理,每次處理100條;所有請求完成后再統一進行處理。
這樣的應用場景,可以這樣處理:
方案一:判斷請求到的數據條目
// 模擬網絡請求function fetch(url, callback) { setTimeout(function (){ callback(null, { subjects: [{ data: Math.round(Math.random() * 100) }] }); }, 2000);}// 實現方案1function multiTask_1 () { var arr = []; var baseUrl = 'https://api.douban.com/v2/movie/top250'; for (var start = 0; start < 10; start++) { var url = baseUrl + '?start=' + start + "&count=1"; fetch(url, function(error, res) { var data = res.subjects; arr = arr.concat(data); // 調用完成后統一處理 if (arr.length === 10) { console.log(arr); } }); }}將運行結果用arr.length來判斷,如果arr.length不像我們期望的那樣,比如由于網絡傳輸或者處理異常,少一條,那么我們將無法做后續的處理。這種處理方式強業務耦合;不具有普適性。
方案二:判斷異步過程執行次數
// 方案2function multiTask_2 () { var taskWatcher = 0; var arr = []; var baseUrl = 'https://api.douban.com/v2/movie/top250'; for (var start = 0; start < 10; start++) { taskWatcher++; var url = baseUrl + '?start=' + start + "&count=1"; fetch(url, function(error, res) { var data = res.subjects; arr = arr.concat(data); taskWatcher--; if (taskWatcher === 0) { console.log(arr); } }); }}方案2 的判斷條件,這里的 taskWatcher 充當異步任務執行情況的觀察員,僅與異步過程的調用次數有關,且與其他處理過程無關。那有沒有其他方案呢
方案三:Promise.all()
Promise.all(iterable) 方法返回一個 Promise, 它將在上述可迭代對象中的所有 Promise 被 resolve 之后被 resolve,或者在任一 Promise 被 reject 后被 reject。
function multiTask_3 () { // var taskWatcher = 0; var taskStack = []; var arr = []; var baseUrl = 'https://api.douban.com/v2/movie/top250'; for (var start = 0; start < 10; start++) { taskStack.push( new Promise((resolve, reject) => { var url = baseUrl + '?start=' + start + "&count=1"; fetch(url, function(error, res) { var data = res.subjects; arr = arr.concat(data); resolve(); }); }) ); } Promise.all(taskStack).then(function () { console.log(arr); });}這種方式更具有通用性,如果異步任務類型不同,也可以用這種方式來解決。不過應當注意reject的處理。避免其對最終處理的影響。
新聞熱點
疑難解答
圖片精選