Javascript 为什么每个任务的计数';s参数在async.瀑布中应相同
对不起,这个问题的名字不好,因为我不知道如何描述清楚 我只是在使用时遇到了一个问题,并最终解决了它。 但我仍然不知道背后发生了什么 我的发现: 使用async.瀑布时,上一个任务的参数计数应与下一个任务相同。 否则,它会说Javascript 为什么每个任务的计数';s参数在async.瀑布中应相同,javascript,node.js,async.js,Javascript,Node.js,Async.js,对不起,这个问题的名字不好,因为我不知道如何描述清楚 我只是在使用时遇到了一个问题,并最终解决了它。 但我仍然不知道背后发生了什么 我的发现: 使用async.瀑布时,上一个任务的参数计数应与下一个任务相同。 否则,它会说“undefined不是函数” 我试过一些测试,我也试着找出它的原因。 对不起,我是JavaScript的新手。我无法理解很多javascript模式。这对我来说太难了 在与源代码搏斗了两个多小时之后,我需要一些帮助。 关于这两个问题,你能给我一些建议吗 它如何处理错误,在哪种
“undefined不是函数”
我试过一些测试,我也试着找出它的原因。
对不起,我是JavaScript的新手。我无法理解很多javascript模式。这对我来说太难了
在与源代码搏斗了两个多小时之后,我需要一些帮助。
关于这两个问题,你能给我一些建议吗
“”、null、undefined
不会导致跳转。这种行为对我来说是有意义的
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的描述中说: 如果未传递相同数量的参数,则未定义的
不是函数的原因是:
瀑布
传递到下一个任务/函数
作为回调函数返回的结果/参数
。因此:
假设您的第一个task1
返回回调(null,1,2)
然后,传递给瀑布的下一个任务/函数被类似于task2(1,2,回调)
的内部调用,但因为您使用不同数量的参数定义了task2
,如函数(param1,回调){}
实际到回调
参数它传递的是2而不是回调
函数。所以您认为它的回调
函数,但您调用了类似于2(null,param)的函数,并得到一个错误,比如说number不是一个函数
。如果在task1
函数中传递的参数较少(而不是较多),则在task2
回调中,参数是未定义的
,而不是预期的实际回调
您可以将传递的参数作为参数
对象。因此,如果您task1
调用callback(null,'a','b')
,那么callback
参数[0]
内部是错误参数(null
)、参数[1]==1
和参数[2]='b'
。然后他们调用您的task2(参数[1]、参数[2]、callbackFn)
,该行为将以瀑布的形式持续到最后一个函数。关于您可以在此处阅读的参数您的第一个问题与javascript有关null,未定义,“
计算为false
,因此异步不考虑错误。您好,@jonasnas您提到的这些行为对我来说很有意义。当我发布这个问题时,我已经测试过了,是的,你是对的。你能理解它是如何实现的吗?谢谢您的回复。是的,您可以将参数作为“arguments”对象传递。因此,如果调用task1调用callback(null,'a','b'),则参数[0]是错误参数,参数[1]==1,参数[2]==b。然后他们叫你task2(参数[1],参数[2],callbackFn)