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?
Antwort
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
Wenn Sie Callback mit false sagen, aber der Rückruf (true) ... wie ist das falsch? – Rolando
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
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. –
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);
}
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.
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
}
}
});
'return Rückruf ('Stop')' wird die Ausführung Ihrer Serie stoppen und Asynchron-Callback-Funktion mit 'err =‚stop'' nennen. –
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