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 + '?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が私たちの期待しているように、例えば、ネットワーク伝送や異常処理のために一つ足りないなら、その後の処理はできません。このような処理方式は強い業務結合である。普遍性を持たない。
方案二:非同期過程の実行回数を判断する

//   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の判断条件は、ここでのtaskWatchが非同期タスク実行状況のオブザーバーとして機能し、非同期プロセスの呼び出し回数のみに関係し、他の処理プロセスとは関係がない。他のプランがありますか?
案三:Promise.all()Promise.all(iterable) 方法は、上記の反復可能なオブジェクトのすべてのPromiseがreolveされた後、または任意のPromiseがrejectされた後にrejectされるPromiseを返す。

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の処理には注意が必要です。最終処理に対する影響を避ける。
方案四:Eventoxy
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は、イベント購読/リリースモードに基づいて、ここのafter方法は、複数のイベントをリスニングできます。それ以外にも、イベントProxyは複数の異なるイベントのリスニングと処理をサポートしています。
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考となる学習価値を持っています。質問があれば、メッセージを書いて交流してください。ありがとうございます。