2013-05-07 9 views
9

Gibt es eine Möglichkeit, dass, wenn Funktion1 wenn booltest als wahr auswertet, nicht zur nächsten Funktion weitergegangen wird, die "2" ausgibt?Gibt es eine Möglichkeit, die Ausführung der nächsten Funktion der Serie mit async in Nodejs zu stoppen?

+1

'return Rückruf ('Stop')' wird die Ausführung Ihrer Serie stoppen und Asynchron-Callback-Funktion mit 'err =‚stop'' nennen. –

+0

Können Sie ein Beispiel dafür zeigen? Ich weiß nicht, wo diese Variable (Flag) hingehen würde, vorausgesetzt, dass booltest sich irgendwo zu Beginn der Verarbeitung des Elements in der Liste zurücksetzen muss. – Rolando

Antwort

21

Der Fluss wird gestoppt, wenn Sie mit wahrem als Fehlerargument Rückruf, so dass im Grunde

if (booltest) 
    callback(null, 'one'); 
else 
    callback(true); 

arbeiten Sollte
+0

Wenn Sie Callback mit false sagen, aber der Rückruf (true) ... wie ist das falsch? – Rolando

+0

Nun, Ihr erstes Argument 'null' ist eigentlich Ihr Fehlerargument. Setzen Sie es einfach auf "True", um die Ausführung Ihres Prozesses zu stoppen. Es ist mein Fehler. Sorry – drinchev

+1

Ich glaube nicht, dass das richtige Design ist. Das erste Argument soll ein Fehler sein. Async stoppt die Verarbeitung, wenn der Callback aufgerufen wird, aber die Verwendung als allgemeine Möglichkeit, die Verarbeitung aus einem beliebigen Grund zu stoppen, erscheint mir seltsam. –

1

Um es logisch zu machen, müssen Sie nur error zu so etwas wie errorOrStop umbenennen könnte:

var test = [1,2,3]; 

test.forEach(function(value) { 
    async.series([ 
     function(callback){ something1(i, callback) }, 
     function(callback){ something2(i, callback) } 
    ], 
    function(errorOrStop) { 
     if (errorOrStop) { 
      if (errorOrStop instanceof Error) throw errorOrStop; 
      else return; // stops async for this index of `test` 
     } 
     console.log("done!"); 
    }); 
}); 

function something1(i, callback) { 
    var stop = i<2; 
    callback(stop); 
} 

function something2(i, callback) { 
    var error = (i>2) ? new Error("poof") : null; 
    callback(error); 
} 
1

Ich denke, die Funktion, die Sie suchen, ist asyncdetect nicht zuordnen.

von https://github.com/caolan/async#detect

Detect (arr, Iterator, Rückruf)

Gibt den ersten Wert in arr die einen async Wahrheits Test besteht. Der Iterator wird parallel angewendet, dh der erste Iterator, der true zurückgibt, löst den Erkennungsrückruf mit diesem Ergebnis aus. Das bedeutet, dass das Ergebnis möglicherweise nicht das erste Element im ursprünglichen arr (in Bezug auf Bestellung) ist, das den Test besteht.

Beispielcode

async.detect(['file1','file2','file3'], fs.exists, function(result){ 
    // result now equals the first file in the list that exists 
}); 

Sie könnten verwenden, die mit Ihrem booltest das gewünschte Ergebnis zu erhalten.

0

Ich übergebe ein Objekt, um zwischen einem Fehler und nur Funktionalität zu unterscheiden. Welche wie folgt aussieht:

function logAppStatus(status, cb){ 
    if(status == 'on'){ 
    console.log('app is on'); 
    cb(null, status); 
    } 
    else{ 
    cb({'status' : 'functionality', 'message': 'app is turned off'}) // <-- object 
    } 
} 

Später:

async.waterfall([ 
    getAppStatus, 
    logAppStatus, 
    checkStop 
], function (error) { 
    if (error) { 
     if(error.status == 'error'){ // <-- if it's an actual error 
     console.log(error.message); 
     } 
     else if(error.status == 'functionality'){ <-- if it's just functionality 
     return 
     } 

    } 
});