私はずっと前に非常によく似た質問に答えました:Coordinating parallel execution in node.js。
しかし、時間が移動しました。それ以来、本当に良い図書館が登場しており、約束のデザインパターンは完全に探究され、さらには標準化されています。あなたが生のコードでそれを行う方法を見たい場合は上記のリンクをクリックしてください。あなただけに読み取ったコードにしたい場合は...
async.js
はasync.js libraryは、基本的には上記のリンクのコードを実装しています。 asyncでは、書くコードは次のようになります。
var listOfAsyncFunctions = [];
for (var i = 0; i < 10; i++) {
(function(n){
// Construct an array of async functions with the expected
// function signature (one argument that is the callback).
listOfAsyncFunctions.push(function(callback){
// Note: async expects the first argument to callback to be an error
someAsyncFunction({someParam:n}, function (data) {
callback(null,data);
});
})
})(i); // IIFE to break the closure
}
// Note that at this point you haven't called the async functions.
// Pass the array to async.js and let it call them.
async.parallel(listOfAsyncFunctions,function (err,result) {
console.log(result); // result will be the same order as listOfAsyncFunctions
});
しかし、async.jの作者はそれ以上のことをしています。非同期にも機能的な配列のような操作があります。それぞれ、map、filter、reduce。これは、非同期処理のアレイが簡単になり、コードが容易に理解することができます:
var listOfParams = [];
for (var i = 0; i < 10; i++) {
// Construct an array of params:
listOfParams.push({someParam:i});
}
async.map(listOfParams,someAsyncFunction,function (err,result) {
console.log(result);
});
もう一つの非同期は、あなたが非同期タスクを処理する方法のための異なるアルゴリズムで提供します。たとえば、ウェブサイトを傷つけたいけど、自分のサーバーにスパムを送信するためにあなたのIPアドレスを禁止したくないと言ってください。一度タスクを1つずつ処理するasync.series()
の代わりparallel
を使用することができます。
async. parallelLimit(listOfAsyncFunctions, 3, function (err,result) {
console.log(result); // result will be the same order as listOfAsyncFunctions
});
Promise.all()
:
// Set-up listOfAsyncFunctions as above
async.series(listOfAsyncFunctions,function (err,result) {
console.log(result); // result will be the same order as listOfAsyncFunctions
});
それとも、一度に3つのタスクを処理する場合
Promise.all()
メソッドは、async.parallel()
と同様に動作しますが、代わりに約束で動作します。あなたはその後、Promise.all()
に渡す約束の配列を作成:
var listOfPromises = [];
for (var i = 0; i < 10; i++) {
// Construct an array of promises
listOfPromises.push(somePromiseFunction({someParam:i}));
}
Promise.all(listOfPromises).then(function(result){
console.log(result);
});
ああ、私は洙長い:-) – Bergi
ない我々は並列動作をカバーしたい場合は必ず、一連の動作またはその両方(I」のために、この上の正規のを望んでいましたdではなく別々の質問を参照)。これは質問に明確に記述してください(そして可能性のあるタイトルもあります) – Bergi
実装の詳細を見たい場合。参照:http://stackoverflow.com/questions/4631774/coordinating-parallel-execution-in-node-js/4631909#4631909その答えはずっと前にasync.jsの前に書かれていました。コードを書く場合は、async.jsを使用してください。あなたが約束を使用してコールバックの配列を構築し、 'promise.all'を使用することを好む場合 – slebetman