Async: Version von async.series, bei der jede Aufgabe die Ergebnisse aller vorherigen Aufgaben erhält

Erstellt am 16. Nov. 2015  ·  5Kommentare  ·  Quelle: caolan/async

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

Alle 5 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen