Javascript 为什么每个任务的计数';s参数在async.瀑布中应相同

Javascript 为什么每个任务的计数';s参数在async.瀑布中应相同,javascript,node.js,async.js,Javascript,Node.js,Async.js,对不起,这个问题的名字不好,因为我不知道如何描述清楚 我只是在使用时遇到了一个问题,并最终解决了它。 但我仍然不知道背后发生了什么 我的发现: 使用async.瀑布时,上一个任务的参数计数应与下一个任务相同。 否则,它会说“undefined不是函数” 我试过一些测试,我也试着找出它的原因。 对不起,我是JavaScript的新手。我无法理解很多javascript模式。这对我来说太难了 在与源代码搏斗了两个多小时之后,我需要一些帮助。 关于这两个问题,你能给我一些建议吗 它如何处理错误,在哪种

对不起,这个问题的名字不好,因为我不知道如何描述清楚

我只是在使用时遇到了一个问题,并最终解决了它。 但我仍然不知道背后发生了什么

我的发现: 使用async.瀑布时,上一个任务的参数计数应与下一个任务相同。 否则,它会说
“undefined不是函数”

我试过一些测试,我也试着找出它的原因。 对不起,我是JavaScript的新手。我无法理解很多javascript模式。这对我来说太难了

在与源代码搏斗了两个多小时之后,我需要一些帮助。 关于这两个问题,你能给我一些建议吗

  • 它如何处理错误,在哪种情况下,它将跳转到最后一次回调
  • 根据我的测试结果,
    “”、null、undefined
    不会导致跳转。这种行为对我来说是有意义的

  • 为什么参数的计数应该完全相同
  • 当然,如果在上一个任务中只传递一个参数,则回调将是未定义的。但我想知道它背后的很多东西

    当它们在简单的演示中分开时,我可以知道这些词: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的描述中说:

    如果未传递相同数量的参数,则未定义的
    不是函数的原因是:

  • 瀑布
    传递到下一个
    任务/函数
    作为回调函数返回的
    结果/参数
    。因此:

  • 假设您的第一个
    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)