国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

node.js多個異步過程中判斷執行是否完成的解決方案

2024-05-06 15:23:42
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了關于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的處理。避免其對最終處理的影響。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 城口县| 油尖旺区| 新建县| 饶河县| 济南市| 松溪县| 连云港市| 常熟市| 乌鲁木齐县| 荔波县| 定兴县| 衡东县| 瓮安县| 潮安县| 许昌县| 炎陵县| 山东省| 本溪| 和平县| 阳原县| 瓦房店市| 洱源县| 藁城市| 铜川市| 获嘉县| 新营市| 南昌市| 宣恩县| 平塘县| 新密市| 远安县| 闽清县| 泰来县| 罗源县| 舟曲县| 马鞍山市| 东兰县| 琼中| 沧州市| 西乡县| 于田县|