2011-01-06 9 views
6

Estoy intentando ejecutar una serie de funciones, cada una pasando la devolución de llamada a la siguiente. En este momento parece que este (excusa los errores de menor importancia, estoy reescribiendo como he puesto!):El argumento "err" cuando se usa la cascada Async en 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); 
}); 

Mi primera pregunta es que no estoy seguro de cómo iniciar esta función con gracia, ya que puede' t tomar una entrada. Eventualmente voy a envolver ese en una función local, pero todavía me inquieta un poco.

En segundo lugar, mientras esto funciona, no tengo idea de cómo se juega el argumento "err" en esto. Si trato de insertarlo en la lista de argumentos, se rompe de varias maneras. Me gustaría poder detectar un error en cualquier función individualmente, ¿o es necesario, ya que tengo un error en la última devolución de llamada que se transmite?

Respuesta

14

La cascada se usa normalmente con funciones anónimas, por lo tanto, los parámetros provienen del alcance exterior.

La forma en que funciona el err es simple, cuando proporciona cualquier cosa que se evalúe como verdadera, el primer argumento de la cascada de la función de devolución de llamada se detendrá y llamará a la devolución de llamada principal.

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

Puede utilizar async.constant para pasar de una entrada a la primera función en la cadena:

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

y modificar la primera función del curso:

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

Opcional: puede llamar a la devolución de llamada con un primer parámetro no nulo:

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

En este caso, la cadena se detiene, y la última función será llamada con err = "algo"

Documentación: https://caolan.github.io/async/docs.html#constant y https://caolan.github.io/async/docs.html#waterfall

Cuestiones relacionadas