2016-06-13 10 views
-1

Wie Sie eine async.each Schleife brechen und einen bestimmten Wert/Fehler zurückgeben, wenn eine Bedingung erfüllt ist. Zum Beispiel, in diesem Fall, wenn Status existiert, möchte ich etwas von der Funktion 'check' zurückgeben, anstatt durch den Rest der Elemente zu iterieren. Irgendwelche Vorschläge?Break async vollständig, wenn Bedingung erfüllt

const check = (condition) => { 

    if (condition === 100) { 

      async.each(items, (item, callback) => { 

       if (status) { 

        callback(Boom.conflict('Conflict')); 
       } else { 

        // some logic 
        callback(destroyInstance); 
       } 
      }); 
    } 
}; 
+0

Sie müssen einen Rückrufparameter in der Prüffunktion haben, damit Sie mit dem hapi-Handler antworten können. –

Antwort

0

Das sieht wie ein Duplikat dieser Frage:

Break out of javascript nested async.each loop but continue main loop

Überprüfen Sie die Antwort aus, sollte es Ihnen helfen. In diesem Fall ist es eine verschachtelte Async in einer anderen asynchronen Schleife, aber die Antwort sollte trotzdem funktionieren.

Edit:

Die Lösung, wie in diesem Thread angegeben, aber ohne die zusätzlichen Schichten ist wie folgt:

async.each(subArray, function(item, callback) { 
     if (SOME_CONDITION) { 
     // Break out of async 
     var err = new Error('Broke out of async'); 
     err.break = true; 
     return callback(err); 
     } 
     // continue 
     callback(); 

     }, function(err) { 
     if (err && err.break) { 
      // Handle break out of async here 
     } else { 
      // Otherwise handle here 
     } 
     }); 
+0

Danke, es hat funktioniert –

+0

Froh, es zu hören! Bitte markieren Sie diese als Antwort, damit auch andere sie verwenden können. Ich werde weitermachen und die Lösung aus dieser anderen Frage hier hinzufügen, da sie sich etwas von dieser Frage unterscheidet. – Sam

0

Als async.each parallel für jedes Element im Array Items arbeitet. Es scheint nicht möglich zu sein, die Aktion bei irgendeiner Bedingung zu stoppen, da die Reihenfolge der Ausführung von Elementen hier nicht deterministisch ist. Ich denke, Sie sollten async.eachSeries stattdessen verwenden.

Also, wenn die Bedingung erfüllt ist, was Sie tun sollten, ist ein Fehler (return callback(err)) zu werfen, was dies tun wird, wird es weiter ausführen. Und wenn Sie einen Wert senden wollen, anstatt zu werfen und Fehler, können Sie nur vorgeben, einen Fehler zu senden, und beim Einchecken der Haupt-Callback von async.eachSeries Sie nur die Art von Wert überprüfen Sie haben von der iteratee Callback-Funktion als u kann zum Beispiel sehen:

async.eachSeries(items, function iteratee(item, callback) { 
    if (status) { 
    return callback(E/V); // error(E) or value(V) u want to send to the done function 
    } else { 
    // some logic 
    callback(); 
    } 
}, function done(e) { 
    if(e){ 
    if(type of e === TYPE OF RETURN VALUE U WANTED) // or any other logic u can come up with 
    return cb(null, e); 
    else return cb(e); 
    } 
    else cb(null, //...); 
}); 

Sag mir, wenn es funktioniert.

+0

Ja, das hat funktioniert. Vielen Dank –