ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js の複数の非同期プロセス中に実行が完了したかどうかを判断する方法 (詳細なチュートリアル)

Node.js の複数の非同期プロセス中に実行が完了したかどうかを判断する方法 (詳細なチュートリアル)

亚连
亚连オリジナル
2018-06-21 17:17:571583ブラウズ

この記事では主に、node.js の複数の非同期プロセスで実行が完了したかどうかを判断するためのいくつかのソリューションをサンプル コードを通じて詳しく紹介します。これは、学習や仕事に必要な学習に役立ちます。以下を見に来てください。

はじめに

この記事では、node.js の複数の非同期プロセスで実行が完了したかどうかを判断することに関連する内容を主に紹介します。詳しい紹介。

シナリオ:

たとえば、大量のネットワーク データをリクエストする場合、1,000 件の結果を取得したいが、データの処理速度が遅く、タイムアウトのリスクがある場合、 10 回の処理に分割され、それぞれ 100 件の結果が処理されます。リクエストが完了すると、すべてのリクエストが均等に処理されます。

このようなアプリケーション シナリオは次のように処理できます:

オプション 1: 要求されたデータ エントリを決定する

// 模拟网络请求
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 を使用して実行結果を判断します。 code>arr.length が予期したものではありません。たとえば、ネットワーク送信または処理の例外が原因で、1 つが欠けていると、その後の処理を実行できなくなります。この処理方法にはビジネスとの結びつきが強く、普遍的なものではありません。 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)

オプション 2: 非同期プロセスの実行数を決定する

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);
 });
}
オプション 2 の判定条件、ここでの taskWatcher は非同期タスクの実行のオブザーバーとして機能し、タスクの呼び出し数にのみ関係します。非同期プロセスであり、他の処理プロセスとは何の関係もありません。他にオプションはありますか? オプション 3: Promise.all()

Promise.all(iterable) メソッドは、上記のすべての反復可能なオブジェクトに含まれる Promise を返します。解決された後に解決されるか、Promise が拒否された後に拒否されます。

 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);
 });
 }

非同期タスクの種類が異なる場合は、この方法で解決することもできます。ただし、リジェクトの処理には注意が必要です。最終処理への影響を回避します。

オプション 4: EventProxy

EventProxy は Pu Ling によって作成されました。https://github.com/JacksonTian/eventproxy

rrreeeEventProxy はイベント サブスクリプション/発行モデルに基づいており、ここでの after メソッドは次のことができます。複数回リッスンする イベントとコールバックは、複数の非同期タスクからのデータ結果の配列を保存します。さらに、EventProxy は複数の異なるイベントのリッスンと処理もサポートします。

上記は私があなたのためにまとめたものです。

関連記事:

vue-cliを使用してインターフェースプロキシを設定する方法

🎜NodeJsでファイルを転送するためにフォームデータ形式を使用する方法🎜🎜🎜🎜WeChatアプレットで画像の遅延読み込みを実装する方法🎜🎜🎜🎜使い方 jsでフォーカスマップ効果を実現する方法🎜🎜

以上がNode.js の複数の非同期プロセス中に実行が完了したかどうかを判断する方法 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。