node.js多個異步過程中判斷執(zhí)行是否完成的解決方案
前言
本文主要給大家介紹了關于node.js多個異步過程中判斷執(zhí)行是否完成的相關內容,可能這樣說大家不是很明白,下面來一起看看詳細的介紹吧。
場景:
想請求量較大的網絡數(shù)據,比如想獲取1000條結果,但數(shù)據處理速度慢,有超時的風險,可以分成10次處理,每次處理100條;所有請求完成后再統(tǒng)一進行處理。
這樣的應用場景,可以這樣處理:
方案一:判斷請求到的數(shù)據條目
// 模擬網絡請求
function fetch(url, callback) {
setTimeout(function (){
callback(null, {
subjects: [{
data: Math.round(Math.random() * 100)
}]
});
}, 2000);
}
// 實現(xiàn)方案1
function 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);
// 調用完成后統(tǒng)一處理
if (arr.length === 10) {
console.log(arr);
}
});
}
}
將運行結果用arr.length來判斷,如果arr.length不像我們期望的那樣,比如由于網絡傳輸或者處理異常,少一條,那么我們將無法做后續(xù)的處理。這種處理方式強業(yè)務耦合;不具有普適性。
方案二:判斷異步過程執(zhí)行次數(shù)
// 方案2
function 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 充當異步任務執(zhí)行情況的觀察員,僅與異步過程的調用次數(shù)有關,且與其他處理過程無關。那有沒有其他方案呢
方案三: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的處理。避免其對最終處理的影響。
方案四: EventProxy
EventProxy是樸靈寫的,https://github.com/JacksonTian/eventproxy
var ep = new EventProxy();
var arr = [];
ep.after('fetchData', 10, function (list) {
list.forEach(function(item){
arr = arr.concat(item);
});
console.log(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;
ep.emit('fetchData', data);
});
}
EventProxy基于事件訂閱/發(fā)布模式,這里的after 方法可以偵聽多次事件,回調中保存了多次異步任務的數(shù)據結果的數(shù)組;除此之外EventProxy還支持多個不同事件的偵聽和處理。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Node.js使用Express創(chuàng)建Web項目詳細教程
如果需要入門使用node.js進行web開發(fā),正在學習 nodejs web開發(fā)指南 的和想快速了解node.js web開發(fā)模式的朋友,相信本文是有一定幫助意義的。2017-03-03
npm安裝淘寶鏡像報錯問題解決(npm install -g cnpm)
本文主要介紹了npm安裝淘寶鏡像報錯問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-01-01

