为什么 async.waterfall 中每个任务的参数计数应该相同
why the count of each task's parameters should be the same in async.waterfall
抱歉问题名称不好,因为我不知道如何描述清楚。
刚刚在使用async.waterfall的时候遇到了问题,最后修复了。
但是我还是不知道后面会发生什么。
我发现了什么:
当我们使用async.waterfall时,最后一个任务的参数counts应该与下一个任务。
否则,它会说 "undefined is not a function"
.
我已经尝试了一些测试,我也试图弄清楚它的source code。
抱歉,我是 JavaScript 的新手。我无法理解很多 javascript 模式。对我来说太难了。
在源代码上苦苦挣扎了两个多小时,我需要一些帮助。
你能给我一些关于这两个问题的提示吗:
- how does it process the error, in which kind of situation, it will jump to last callback?
根据我的测试结果,'', null,undefined
不会导致跳转。这种行为对我来说很有意义。
- why the count of parameters should be the same exactly?
如果在上一个任务中只传递一个参数,当然,回调将是未定义的。但我想知道更多。
我可以知道这些词:apply、closure 等,当它们在简单的演示中分开时。但是当它们连在一起的时候,我就瞎了。
非常感谢简答和长答。
可以的话,说不定能给个链接,我自己研究一下。
提前致谢。
代码示例:
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
的原因是:
waterfall
传递给下一个 task/function
回调 + extra param as a callback
函数返回的 results/parameters
。所以:
如果假设您的第一个 task1
returns callback(null, 1, 2);
那么您传递给 waterfall
的下一个 task/function
由内部调用像这样 task2(1, 2, callback)
但是因为你用不同数量的参数定义了 task2
,比如 function(param1, callback){}
实际上是 callback
参数,它传递 2 而不是 callback
函数。所以你认为它的 callback
函数但是你调用类似 2(null, param) 的东西并得到一个错误让我们说 number is not a function
。如果您在 task1
函数中传递较少(而不是更多)参数,那么在您的 task2
中 callback
参数是 undefined
而不是您期望的实际回调。
您可以获得作为 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
抱歉问题名称不好,因为我不知道如何描述清楚。
刚刚在使用async.waterfall的时候遇到了问题,最后修复了。 但是我还是不知道后面会发生什么。
我发现了什么:
当我们使用async.waterfall时,最后一个任务的参数counts应该与下一个任务。
否则,它会说 "undefined is not a function"
.
我已经尝试了一些测试,我也试图弄清楚它的source code。 抱歉,我是 JavaScript 的新手。我无法理解很多 javascript 模式。对我来说太难了。
在源代码上苦苦挣扎了两个多小时,我需要一些帮助。 你能给我一些关于这两个问题的提示吗:
- how does it process the error, in which kind of situation, it will jump to last callback?
根据我的测试结果,'', null,undefined
不会导致跳转。这种行为对我来说很有意义。
- why the count of parameters should be the same exactly?
如果在上一个任务中只传递一个参数,当然,回调将是未定义的。但我想知道更多。
我可以知道这些词:apply、closure 等,当它们在简单的演示中分开时。但是当它们连在一起的时候,我就瞎了。
非常感谢简答和长答。 可以的话,说不定能给个链接,我自己研究一下。
提前致谢。
代码示例:
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
的原因是:
waterfall
传递给下一个task/function
回调+ extra param as a callback
函数返回的results/parameters
。所以:如果假设您的第一个
task1
returnscallback(null, 1, 2);
那么您传递给waterfall
的下一个task/function
由内部调用像这样task2(1, 2, callback)
但是因为你用不同数量的参数定义了task2
,比如function(param1, callback){}
实际上是callback
参数,它传递 2 而不是callback
函数。所以你认为它的callback
函数但是你调用类似 2(null, param) 的东西并得到一个错误让我们说number is not a function
。如果您在task1
函数中传递较少(而不是更多)参数,那么在您的task2
中callback
参数是undefined
而不是您期望的实际回调。
您可以获得作为 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