为什么 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 模式。对我来说太难了。

在源代码上苦苦挣扎了两个多小时,我需要一些帮助。 你能给我一些关于这两个问题的提示吗:

  1. how does it process the error, in which kind of situation, it will jump to last callback?

根据我的测试结果,'', null,undefined不会导致跳转。这种行为对我来说很有意义。

  1. 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 的原因是:

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

  2. 如果假设您的第一个 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 函数中传递较少(而不是更多)参数,那么在您的 task2callback 参数是 undefined 而不是您期望的实际回调。

您可以获得作为 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