首頁 > web前端 > js教程 > 主體

在node.js中多個非同步過程中如何判斷執行是否完成(詳細教學)

亚连
發布: 2018-06-21 17:17:57
原創
1545 人瀏覽過

這篇文章主要為大家介紹了關於node.js多個非同步過程中判斷執行是否完成的幾種解決方案,文中透過範例程式碼介紹的非常詳細,對大家的學習或工作有一定的參考學習價值,需要的朋友們下面來一起看看吧。

前言

本文主要為大家介紹了關於node.js多個非同步過程中判斷執行是否完成的相關內容,可能這樣說大家不是很明白,下面來一起看看詳細的介紹吧。

場景:

想請求量較大的網路數據,例如想取得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 + &#39;?start=&#39; + 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不像我們期望的那樣,例如由於網路傳輸或處理異常,少一條,那麼我們將無法做後續的處理。這種處理方式強業務耦合;不具普適性。

方案二:判斷非同步過程執行次數

// 方案2
function multiTask_2 () {
 var taskWatcher = 0;
 var arr = [];
 var baseUrl = &#39;https://api.douban.com/v2/movie/top250&#39;;
 for (var start = 0; start < 10; start++) {
 taskWatcher++;
 var url = baseUrl + &#39;?start=&#39; + 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 = &#39;https://api.douban.com/v2/movie/top250&#39;;
 for (var start = 0; start < 10; start++) {
 taskStack.push(
  new Promise((resolve, reject) => {
  var url = baseUrl + &#39;?start=&#39; + 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(&#39;fetchData&#39;, 10, function (list) {
 list.forEach(function(item){
  arr = arr.concat(item); 
 });
 console.log(arr);
 });
 var baseUrl = &#39;https://api.douban.com/v2/movie/top250&#39;;
 for (var start = 0; start < 10; start++) {
 var url = baseUrl + &#39;?start=&#39; + start + "&count=1";
  fetch(url, function(error, res) {
  var data = res.subjects;
  ep.emit(&#39;fetchData&#39;, data);
 });
 }
登入後複製

EventProxy是基於事件訂閱/發布模式,這裡的after 方法可以偵聽多次事件,回呼中保存了多次非同步任務的資料結果的陣列;除此之外EventProxy還支援多個不同事件的偵聽和處理。

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

使用vue-cli如何設定介面代理

在NodeJs中如何使用form-data格式傳輸檔案

在微信小程式中如何實作圖片懶載入

#使用js如何實作焦點圖效果

以上是在node.js中多個非同步過程中如何判斷執行是否完成(詳細教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板