Ich stoße häufig auf eine Situation, in der eine async.series-Aufgabe die Ergebnisse mehrerer vorheriger Aufgaben benötigt. async.waterfall ist unzureichend, da es nur das Ergebnis der letzten vorherigen Aufgabe liefert. async,auto ist zu ausführlich und bietet zusätzliche, nicht benötigte Abhängigkeitsdeklarationen.
Eine neue Funktion (oder eine Verbesserung von async.series) wäre praktisch. Jede Aufgabe würde ein Ergebnisobjekt erhalten, das die Ergebnisse aller vorherigen Aufgaben enthält
Mögliche Namen: akkumulieren, seriesAkkumulieren
Beispiel:
async.accumulate({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback, results){
// results: {one: 1}
setTimeout(function(){
callback(null, 2);
}, 100);
},
three: function(callback, results){
// results: {one: 1, two: 2}
setTimeout(function(){
callback(null, results.one + results.two);
}, 100);
}
},
function(err, results) {
// results is now equal to: {one: 1, two: 2, three: 3}
});
Haben Sie async.auto
ausgecheckt? Es macht etwas sehr ähnliches, was Sie beschreiben.
Wie ich bereits erwähnt habe, ist async.auto in einem einfachen Serienszenario zu ausführlich. Der Benutzer muss deklarieren, dass jeder Schritt vom vorherigen abhängt, was zu diesen hässlichen Arrays und doppelten Schrittnamen führt
async.auto({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: ["one", function(callback, results){
setTimeout(function(){
callback(null, 2);
}, 100);
}],
three: ["two", function(callback, results){
setTimeout(function(){
callback(null, results.one + results.two);
}, 100);
}
]
},
function(err, results) {
// results is now equal to: {one: 1, two: 2, three: 3}
});
Wir werden in der nächsten Hauptversion einige Verbesserungen an auto vornehmen -- immer den Callback als letztes und außerdem autoInject
(#608) hinzufügen, was die Abhängigkeiten aus den Parameternamen ableitet.
Ich mag diesen Vorschlag nicht, weil er von der Reihenfolge der Objektschlüssel abhängt - etwas, das in JS-Umgebungen nicht garantiert ist (und nur in Node für kleine Objekte garantiert wird). Mit Arrays ist es möglich, aber es ist async.waterfall
zu ähnlich. Ich bin mir nicht sicher, ob wir etwas zwischen auto
und waterfall
brauchen, besonders wenn wir autoInject
hinzufügen.
Ein Weg, um das zu erreichen, was Sie wollen:
function seriesAccumulate(tasks, done) {
async.reduce(tasks, [], function (results, task, next) {
task(results, function (err, result) {
results.push(result);
next(err, result);
});
}, done);
}
Ich würde davon abraten, ein Objekt zu verwenden, um in Serie zu iterieren.
Schließen Sie dies. Ich glaube nicht, dass wir eine andere Methode zwischen series
und waterfall
brauchen.