Async: Feature/Support - Leeres Taskset -> finaler Callback automatisch beim nächsten Tick ausgelöst?

Erstellt am 13. Apr. 2017  ·  3Kommentare  ·  Quelle: caolan/async

Angenommen, wir verwenden async.map oder wirklich fast jedes der async-Dienstprogramme

Meine Frage/Funktionsanforderung lautet: Wenn das Aufgaben-Array/der Aufgaben-Satz leer ist, löst Async den letzten Rückruf beim nächsten Tick aus? Wenn nicht, gibt es eine Möglichkeit, async anzuweisen, dies zu tun? Wäre ein nettes Feature.
Ansonsten habe ich viel davon in meinem Code, der ausführlicher ist:

async.map([], function(item,cb){

}, function final(err, results){
    process.next(function(){ 
      cb(err,results);
   });
});

Um Zalgo zu vermeiden, ist dies oben notwendig, aber es ist viel schöner:

async.map([], function(item,cb){

}, cb);

Ich denke, wir könnten überprüfen, ob das Array leer ist, und wenn ja, kehren Sie früh mit zurück

if(![].length){
   return process.next(cb);
}

was könnt ihr empfehlen?

question

Hilfreichster Kommentar

Ja ,

Eine Vereinfachung, die Sie tun können, ist:

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate können Sie Argumente übergeben, die an die Funktion übergeben werden.

Alle 3 Kommentare

Hey @ORESoftware , danke für die Frage! Bei einem leeren Array/Satz ruft async den letzten Callback im selben Tick auf, da eingebaute Verzögerungen in v2.0.0 aus Leistungsgründen entfernt wurden (ich glaube nicht, dass async < v2.0.0 hatte für diesen Fall sogar einen eingebauten Aufschub).

Eine einfache Problemumgehung besteht darin, async.map in async.ensureAsync :

async.ensureAsync(async.map)([], function(item, cb) {

}, cb);

oder irgendwo am Anfang deines Codes:

const asyncMap = async.ensureAsync(async.map);
// then call `asyncMap` just as you would `async.map`

Ansonsten ist der process.nextTick Ihnen vorgeschlagene async.setImmediate oder async.nextTick ansehen.

Ja ,

Eine Vereinfachung, die Sie tun können, ist:

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate können Sie Argumente übergeben, die an die Funktion übergeben werden.

Oh schön, das wusste ich nicht über process.nextTick usw., das ist der Hammer

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen