2013-02-18 14 views
8

Ciao sto usando il modulo async di node.js per implementare un ciclo for in modo asincrono.come interrompere async.js ogni ciclo?

La mia domanda è: come interrompere l'esecuzione del ciclo e uscire dal ciclo? Ho provato a dare return, return false ma senza fortuna.

Ecco il codice di esempio:

async.until( 

    function() { return goal; }, 

    function(callback) { 

     async.each(_rules, 

      function(rule,callback) { 

       var outcome = true; 
       .... some code .... 
       if(changes){ 
         console.log("hi"); 
         return false;// HERE I NEED TO BREAK 
       } 
       else 
       callback(); 

      }, 

      function(err){ } 
     ); 

     if (!changes || session.process)     
      goal = true; 

     callback(); 
    }, 

    function(err){ callback(session); }  
); 
+3

si può rompere con l'invio di qualcosa nel primo parametro della richiamata (che 'async' interpreterà come un "errore" e fermare il ciclo). Rendilo un valore noto (un * verit *) che puoi verificare nella callback finale per sapere che si trattava di un'interruzione e non di un errore. – Chad

+0

potresti dirmi come fare qui? non posso chiamare 'callback (1)' al posto di 'return false;' riga che ho mostrato nel codice e lo interrompo – mithunsatheesh

+0

Se non richiamate la callback in tutti i percorsi, il ciclo non terminerà mai. Se hai un percorso che non chiama la richiamata, allora stai sbagliando. Questo è asincrono, il tuo valore di ritorno non fa nulla. – Chad

risposta

5

async.until chiama ripetutamente la funzione fino a quando il test restituisce vero. Quindi il test deve restituire true in modo da uscire dal ciclo. Questo è l'opposto di async.whilst che viene eseguito ripetutamente mentre il test viene valutato come vero.

async.each chiama le funzioni in parallelo, quindi ciò che ritorna non ha importanza. Non è un ciclo che puoi interrompere, ma un iteratore che si muove sopra l'array. La tua condizione di smettere di usare async.each dovrebbe essere in prova per async.until e dovresti scorrere le regole da solo.

5

In realtà non esiste un "loop" in quanto tale da cui uscire. Tutti i tuoi articoli nella tua collezione sono usati in parallelo

L'unico modo per "interrompere" il "ciclo" è chiamare il callback con un argomento di errore. Dato che non c'è nulla che ti impedisca di mettere altre cose lì dentro, potresti modificarlo un po '.

Dalla documentazione:

noti che poiché questa funzione si applica l'iteratore a ciascun elemento parallelo v'è alcuna garanzia che le funzioni iteratore complete in ordine.

Anche se si restituisce un errore, si avranno ancora diverse richieste in sospeso potenzialmente così si vuole veramente limitare la quantità di oggetti che si usano in una volta. Per limitare la quantità di richieste in sospeso, è possibile utilizzare eachSeries o EachLimit.

Ad esempio:

async.each(_rules, 
     function(rule,callback) { 
      if(changes){      
        return callback({ data: 'hi'}); // stop 
      } 
      ... 
      if(realerror){ 
       return callback({ error: realerror}); // stop with an error 
      } 
      callback(); // continue 
     }, 

     function(result){ 
      if(!result){ 
      return othercallback('no results'); 
      } 
      // check if we have a real error: 
      if(result.error){ 
      return othercallback(result.error); 
      } 
      return othercallback(null, result.data); 
     } 
    ); 

PS: se non stai facendo asincrona, utilizzare underscore

+0

potresti dirmi come fare qui? non posso chiamare 'callback (1)' al posto di 'return false;' linea che ho mostrato nel codice e spezzarlo – mithunsatheesh

+0

@mithunsatheesh Risposta breve: devi e si puoi. – Chad

+1

invece di restituire false, basta fare "return callback ({data: false})" e controllare il primo argomento nel callback finale. – AndyD

Problemi correlati