为什么每个任务的参数在async.waterfall中应该是相同的

对不起,因为我不知道如何描述清楚。

当我使用async.waterfall并且最后修复它时,我遇到了一个问题。 但我仍然不知道背后发生了什么。

我发现:当我们使用async.waterfall时 ,最后一个任务的参数数量应该和下一个任务一样。 否则,它会说"undefined is not a function"

我已经尝试了一些testing,我也试图找出它的源代码 。 对不起,我是JavaScript的新手。 我无法理解大量的JavaScript模式。 对我来说太难了

经过两个多小时的源代码苦苦挣扎,我需要一些帮助。 你可以给我一些关于这两个问题的提示:

  1. 它如何处理错误 ,在哪种情况下,会跳到最后一个callback?

根据我的testing结果, '', null,undefined不会引起跳转。 这种行为对我来说很有意义。

  1. 为什么参数的数量应该完全一样?

如果在上一个任务中只传递一个参数,当然这个callback将是未定义的。 但是我想知道很多。

我可以知道这些话:申请,封闭等,当他们在简单的演示分离。 但是当他们联合在一起的时候,我就变成了盲人。

简答题和长答案都非常赞赏。 如果可能的话,也许可以提供一些链接,我可以自己学习。

提前致谢。

代码示例:

 var async = require('async'); function test_waterfall() { async.waterfall([ function(callback) { /* works - pass all */ // callback(null, '1') // null 12 // callback('','first') // null 12 // callback(undefined,'1') // null 12 /* skip second, jump to error*/ // callback('error1') // error1 undefined // callback('erro1', 'value1') // error1 value1 // callback({}) // {} undefined // callback([]) // [] undefined /* wrong -- undefined is not a function*/ callback() // callback('') // callback(undefined) // callback(null) }, function(arg, callback) { // If pass only one argument in last task, //of course, the callback will be undefined. callback(null, arg+'2'); } ], function(err, result) { console.info(err) console.info(result) }); } test_waterfall() 

参数应该匹配,因为这是如何实现的,并描述了API说: https : //github.com/caolan/async#waterfall

如果你没有传递相同数量的参数,你得到undefined is not a function的原因undefined is not a function ,因为:

  1. waterfall传递到下一个task/function返回的results/parameters在callback+ extra param as a callback函数。 所以:

  2. 如果让我们说你的第一个task1返回callback(null, 1, 2); 那么你传递给waterfall下一个task/function被这个task2(1, 2, callback)这样的内部task2(1, 2, callback)但是因为你用不同数量的参数(如function(param1, callback){}定义了task2 , 2不是callback函数。 所以你认为它的callback函数,但你打电话像2(空,参数),并得到一个错误让说number is not a function 。 如果你在task1函数中callback参数less(不是更多),那么你的task2 callback参数是undefined而不是你期望的实际callback。

您可以获取传递参数作为arguments对象。 所以如果你task1调用callback(null, 'a', 'b') ,那么在callback arguments[0]里面是错误参数( null ), argument[1] == 1argument[2] == 'b' 。 然后他们调用你的task2(argument[1], argument[2], callbackFn)和行为连续性作为瀑布直到最后一个函数。 关于你可以在这里阅读的论点https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments