为什么每个任务的参数在async.waterfall中应该是相同的
对不起,因为我不知道如何描述清楚。
当我使用async.waterfall并且最后修复它时,我遇到了一个问题。 但我仍然不知道背后发生了什么。
我发现:当我们使用async.waterfall时 ,最后一个任务的参数数量应该和下一个任务一样。 否则,它会说"undefined is not a function"
。
我已经尝试了一些testing,我也试图找出它的源代码 。 对不起,我是JavaScript的新手。 我无法理解大量的JavaScript模式。 对我来说太难了
经过两个多小时的源代码苦苦挣扎,我需要一些帮助。 你可以给我一些关于这两个问题的提示:
- 它如何处理错误 ,在哪种情况下,会跳到最后一个callback?
根据我的testing结果, '', null,undefined
不会引起跳转。 这种行为对我来说很有意义。
- 为什么参数的数量应该完全一样?
如果在上一个任务中只传递一个参数,当然这个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
,因为:
-
waterfall
传递到下一个task/function
返回的results/parameters
在callback+ extra param as a callback
函数。 所以: -
如果让我们说你的第一个
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] == 1
和argument[2] == 'b'
。 然后他们调用你的task2(argument[1], argument[2], callbackFn)
和行为连续性作为瀑布直到最后一个函数。 关于你可以在这里阅读的论点https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments