2013-05-07 12 views
9
async.map(list, function(object, callback) { 
    async.series([ 
     function(callback) { 
     console.log("1"); 

     var booltest = false; 
     // assuming some logic is performed that may or may not change booltest 
     if(booltest) { 
      // finish this current function, move on to next function in series 
     } else { 
      // stop here and just die, dont move on to the next function in the series 
     } 

     callback(null, 'one'); 
     }, 
     function(callback) { 
     console.log("2"); 
     callback(null, 'two'); 
     } 
    ], 
    function(err, done){ 
    }); 
    }); 

C'è un modo tale che se funzione1 se booltest restituisce true, non passare alla funzione successiva che emette "2"?C'è un modo per fermare l'esecuzione della prossima funzione della serie con async in nodejs?

+1

'ritorno di richiamata ('stop')' si fermerà l'esecuzione di vostra serie e chiamare la funzione di callback asincroni con err = 'stop'' '. –

+0

Puoi mostrare un esempio di questo? Non sembro sapere dove quella variabile (flag) andrebbe assumendo che booltest debba resettarsi da qualche parte all'inizio dell'elaborazione dell'elemento nella lista. – Rolando

risposta

21

Il flusso si arresterà se richiamata con il vero, come la tua tesi errore, in modo sostanzialmente

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

dovrebbe funzionare

+0

Quando si dice callback con false, ma il callback (true) ... come è falso? – Rolando

+0

Bene, il tuo primo argomento "null" è in realtà il tuo argomento err. Basta impostarlo su true, per interrompere l'esecuzione del processo. È un mio errore Scusa – drinchev

+1

Non penso che sia il giusto design. Il primo argomento è pensato per essere un errore. Async capita di interrompere l'elaborazione se viene richiamato il callback, ma usarlo come un modo generale per interrompere l'elaborazione per una ragione arbitraria mi sembra strano. –

1

Per rendere più logico, si può solo cambiare titolo error a qualcosa di simile errorOrStop:

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

Penso che la funzione che stai cercando sia async.detect non map.

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

rilevare (arr, iteratore, callback)

Restituisce il primo valore in arr che passa un test asincrona verità. L'iteratore viene applicato in parallelo, il che significa che il primo iteratore per restituire true attiverà il callback di rilevamento con quel risultato. Ciò significa che il risultato potrebbe non essere il primo elemento nell'arr originale (in termini di ordine ) che supera il test.

esempio di codice

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

Si potrebbe usare che con il vostro booltest per ottenere il risultato desiderato.

0

Sto passando un oggetto per distinguere tra un errore e solo la funzionalità. Che si presenta come:

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 
    } 
} 

tardi:

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 
     } 

    } 
}); 
Problemi correlati