Vor langer Zeit habe ich eine sehr ähnliche Frage hier beantwortet: Coordinating parallel execution in node.js.
Allerdings haben sich die Zeiten bewegt. Seitdem ist eine wirklich gute Bibliothek erschienen und das vielversprechende Designmuster wurde vollständig erforscht und sogar in der Sprache standardisiert. Wenn Sie sehen möchten, wie es mit Rohcode gemacht werden kann, klicken Sie auf den obigen Link. Wenn Sie nur auf Code lesen wollen ..
async.js
Die async.js library haben grundsätzlich implementiert, um den Code in den obigen Link. Mit async den Code würde schreiben Sie etwas wie folgt aussehen:
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
});
Allerdings haben die Autoren von async.js getan mehr als das. Async hat auch funktionale array-artige Operationen: jeweils, map, filter, reduce. Es macht asynchron Verarbeitung Arrays einfach und macht den Code leichter zu verstehen:
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);
});
Eine andere Sache async gibt Ihnen verschiedene Algorithmen für ist, wie die asynchronen Aufgaben zu verarbeiten. Sagen Sie zum Beispiel, Sie möchten eine Website scrappen, aber nicht, dass sie Ihre IP-Adresse für das Spammen ihres Servers verbieten.Sie können async.series()
statt parallel
verwenden Sie die Aufgaben einer nach dem anderen zu verarbeiten:
// Set-up listOfAsyncFunctions as above
async.series(listOfAsyncFunctions,function (err,result) {
console.log(result); // result will be the same order as listOfAsyncFunctions
});
Oder wenn Sie möchten, zu einem Zeitpunkt 3 Aufgaben verarbeiten:
async. parallelLimit(listOfAsyncFunctions, 3, function (err,result) {
console.log(result); // result will be the same order as listOfAsyncFunctions
});
Promise.all()
Die Promise.all()
Methode funktioniert in ähnlicher Weise wie async.parallel()
nur funktioniert es mit Versprechen statt. Sie bauen eine Reihe von Versprechungen leiten sie dann an 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);
});
Ah, ich eine kanonische auf diese für soo lange :-) wollte – Bergi
nicht sicher, ob wir Parallelbetrieb, sequentiellen Betrieb oder beides (I‘abdecken wollen eher separate Fragen). Dies sollte klar in der Frage (und möglicherweise sogar Titel) angegeben werden – Bergi
Wenn Sie ein Implementierungsdetail sehen möchten. Siehe: http://stackoverflow.com/questions/4631774/coordination-parallel-execution-in-node-js/4631909#4631909. Diese Antwort wurde lange vor async.js geschrieben. Wenn Sie Code schreiben wollen, benutzen Sie async.js. Wenn Sie Versprechungen bevorzugen, verwenden Sie eine Schleife, um ein Array von Callbacks zu erstellen, dann verwenden Sie 'promise.all' – slebetman