2011-01-06 11 views
6

Próbuję wykonać serię funkcji, z których każda przechodzi do następnego. Teraz wygląda to tak (przepraszam jakieś drobne błędy, jestem przepisanie go jak pisać!):Argument "err" podczas używania asynchronicznego wodospadu w pliku 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); 
}); 

Moje pierwsze pytanie jest taka, że ​​nie jestem pewien, jak rozpocząć tę funkcję wdziękiem, gdyż może” t weź wejście. Zamierzam w końcu zawinąć tę funkcję lokalną, ale nadal mnie to niepokoi.

Po drugie, dopóki to działa, nie mam pojęcia, jak argument "err" w to gra. Jeśli spróbuję wstawić go na listę argumentów, łamie się na różne sposoby. Chciałbym być w stanie złapać błąd w dowolnej funkcji osobno - czy jest to potrzebne, ponieważ mam błąd na ostatnim wywołaniu zwrotnym, które zostało przekazane?

Odpowiedz

14

Wodospad jest zwykle używany z anonimowymi funkcjami, dlatego parametry pochodzą z zewnętrznego zakresu.

Sposób działania err jest prosty, jeśli podasz cokolwiek, co jest prawdziwe, jako pierwszy argument funkcji zwrotnej, wodospad zatrzyma się i wywoła główne wywołanie zwrotne.

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

Można użyć async.constant przejść wejście do pierwszej funkcji w łańcuchu:

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

i modyfikować pierwszą funkcję przedmiotu:

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

Opcjonalnie: ty można wywołać wywołanie zwrotne z niezerowym pierwszym parametrem:

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

W tym przypadku łańcuch jest zatrzymany, a ostatnia funkcja będzie wywoływana z err = „coś”

Dokumentacja: https://caolan.github.io/async/docs.html#constant i https://caolan.github.io/async/docs.html#waterfall

Powiązane problemy