2011-01-06 18 views
6

Sto provando a eseguire una serie di funzioni, ciascuna che passa la richiamata alla successiva. In questo momento sembra che questo (scusa per eventuali errori minori, sto riscrivendo come I post!):L'argomento "err" quando si utilizza la cascata asincrona in node.js

function func1(callback) { 
    callback(null, "stuff"); 
} 

function func2(input, callback) { 
    callback(null, "foo" + input); 
} 

async.waterfall([func1, func2], function(err, result) { 
    sys.puts(result); 
}); 

La mia prima domanda è che io non sono sicuro di come iniziare questa funzione con grazia, dal momento che può' t prendere un input. Alla fine lo completerò in una funzione locale, ma mi rende ancora un po 'a disagio.

In secondo luogo, mentre questo funziona, non ho idea di come l'argomento "errare" giochi in questo. Se provo a inserirlo nella lista degli argomenti, si rompe in vari modi. Mi piacerebbe essere in grado di rilevare un errore in qualsiasi funzione individualmente - o è necessario, dal momento che ho un errore sull'ultimo callback che viene trasmesso?

risposta

14

La cascata viene normalmente utilizzata con funzioni anonime, pertanto i parametri provengono dall'ambito esterno.

Il modo in cui lo err funziona è semplice, quando si fornisce qualcosa che restituisce true come primo argomento della funzione di richiamata, la cascata si interrompe e chiama il callback principale.

function doStuff(foo, bla) { 
    // more setup here 

    async.waterfall([ 
     function(callback){ 
      try { 
       // something that might explode 
       callback(null, foo, bla); 

      } catch (e) { 
       callback(e); 
      } 
     }, 

     function(arg1, arg2, callback){ 
      callback(null, 'three'); 
     }, 

     function(arg1, callback){ 
      callback(null, 'done'); 
     } 
    ], 

    function (err, status) { 
     // if the above try/catche catches something, we will end up here 
     // otherwise we will receive 'done' as the value of status 
     // after the third function has finished 
    }); 
} 
0

È possibile utilizzare async.constant per passare un input per la prima funzione della catena:

async.waterfall([ 
    async.constant(parameter), 
    func1, 
    func2 
], function (err, result) {    
}); 

e modificare la prima funzione, naturalmente:

function func1(input,callback) { 
    callback(null, "stuff"); 
} 

Optional: si può richiamare con un primo parametro non nullo:

function func1(input,callback) { 
     callback("something"); 
    } 

In questo caso la catena viene interrotta, e l'ultima funzione verrà chiamata con err = "qualcosa"

documentazione: https://caolan.github.io/async/docs.html#constant e https://caolan.github.io/async/docs.html#waterfall