摘要:方案二判斷異步過程執(zhí)行次數方案方案的判斷條件,這里的充當異步任務執(zhí)行情況的觀察員,僅與異步過程的調用次數有關,且與其他處理過程無關。不過應當注意的處理。避免其對最終處理的影響。
場景:想請求量較大的網絡數據,比如想獲取1000條結果,但數據處理速度慢,有超時的風險,可以分成10次處理,每次處理100條;所有請求完成后再統一進行處理。
這樣的應用場景,可以這樣處理:
方案一:判斷請求到的數據條目</>復制代碼
// 模擬網絡請求
function fetch(url, callback) {
setTimeout(function (){
callback(null, {
subjects: [{
data: Math.round(Math.random() * 100)
}]
});
}, 2000);
}
// 實現方案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);
// 調用完成后統一處理
if (arr.length === 10) {
console.log(arr);
}
});
}
}
將運行結果用arr.length來判斷,如果arr.length不像我們期望的那樣,比如由于網絡傳輸或者處理異常,少一條,那么我們將無法做后續(xù)的處理。這種處理方式強業(yè)務耦合;不具有普適性。
方案二:判斷異步過程執(zhí)行次數</>復制代碼
// 方案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í)行情況的觀察員,
僅與異步過程的調用次數有關,且與其他處理過程無關。那有沒有其他方案呢
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的處理。避免其對最終處理的影響。
方案四: EventProxyEventProxy是樸靈寫的,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 方法可以偵聽多次事件,回調中保存了多次異步任務的數據結果的數組;除此之外EventProxy還支持多個不同事件的偵聽和處理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/90324.html
摘要:簡介項目命名為就是一個服務器單純開發(fā)一個服務器的想法,變成構建網絡應用的一個基本框架發(fā)展為一個強制不共享任何資源的單線程,單進程系統。單線程弱點無法利用多核錯誤會引起整個應用退出,應用的健壯性大量計算占用導致無法繼續(xù)調用異步。 NodeJs簡介 Ryan Dahl項目命名為:web.js 就是一個Web服務器.單純開發(fā)一個Web服務器的想法,變成構建網絡應用的一個基本框架.Node發(fā)展...
摘要:事件觸發(fā)線程主要負責將準備好的事件交給引擎線程執(zhí)行。它將不同的任務分配給不同的線程,形成一個事件循環(huán),以異步的方式將任務的執(zhí)行結果返回給引擎。 Fundebug經作者浪里行舟授權首發(fā),未經同意請勿轉載。 前言 本文我們將會介紹 JS 實現異步的原理,并且了解了在瀏覽器和 Node 中 Event Loop 其實是不相同的。 一、線程與進程 1. 概念 我們經常說 JS 是單線程執(zhí)行的,...
摘要:的異步完成整個異步環(huán)節(jié)的有事件循環(huán)觀察者請求對象以及線程池。執(zhí)行回調組裝好請求對象送入線程池等待執(zhí)行,實際上是完成了異步的第一部分,回調通知是第二部分。異步編程是首個將異步大規(guī)模帶到應用層面的平臺。 showImg(https://segmentfault.com/img/remote/1460000011303472); 本文首發(fā)在個人博客:http://muyunyun.cn/po...
摘要:使用了一個事件驅動非阻塞式的模型,使其輕量又高效。的包管理器,是全球最大的開源庫生態(tài)系統。按照這個定義,之前所述的阻塞,非阻塞,多路復用信號驅動都屬于同步。 系列文章 Nodejs高性能原理(上) --- 異步非阻塞事件驅動模型Nodejs高性能原理(下) --- 事件循環(huán)詳解 前言 終于開始我nodejs的博客生涯了,先從基本的原理講起.以前寫過一篇瀏覽器執(zhí)行機制的文章,和nodej...
閱讀 3464·2021-11-22 12:00
閱讀 681·2019-08-29 13:24
閱讀 2914·2019-08-29 11:31
閱讀 2605·2019-08-26 14:00
閱讀 3210·2019-08-26 11:42
閱讀 2484·2019-08-23 18:31
閱讀 809·2019-08-23 18:27
閱讀 2857·2019-08-23 16:58