2011-01-06 84 views
6

我试图执行一系列函数,每个函数都将回调传递给下一个。现在它看起来像这样(原谅任何小错误,我重写它,因为我发表文章!):在node.js中使用异步瀑布时的“err”参数

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

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

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

我的第一个问题是,我不知道如何优雅地启动这一功能,因为它可以”不需要输入。我将最终将其包含在本地函数中,但它仍然让我略感不安。其次,虽然这个工作,我不知道“错误”的论点如何发挥到这一点。如果我尝试将它插入参数列表中,它会以各种方式中断。我希望能够单独捕获任何函数中的错误 - 或者需要这样做,因为我在传递的最后一个回调函数上有错误?

回答

14

瀑布通常与匿名函数一起使用,因此参数来自外部作用域。

err的工作原理很简单,当您提供任何计算结果为true的值时,回调函数瀑布的第一个参数将停止并调用主回调函数。

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

可以使用async.constant到输入传递给第一个函数链:

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

和修改过程中的第一个功能:

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

可选:可以使用非空的第一个参数调用回调:

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

在这种情况下,链停止,最后的功能将与ERR =“东西”

文档被称为:https://caolan.github.io/async/docs.html#constanthttps://caolan.github.io/async/docs.html#waterfall