异步 - 回调不是函数

Laz*_*ing 1 javascript asynchronous node.js

我正在尝试在 node js 中使用 async 来控制某些函数的执行流程。在下面的代码中,我有三个声明的函数,它们应该分别打印“一”、“二”和“三”,以及执行其他任务(打印只是为了我可以看到什么时候执行)。

async.waterfall([
    function(callback) {
      settings();
      console.log("1");
      callback(null, 'one');
    },
    function(callback) {
      profile();
      console.log("2");
      callback(null, 'two');
    },
    function(callback) {
        console.log("3");
        groups();
        callback(null, 'two');
    }
  ]);
Run Code Online (Sandbox Code Playgroud)

所以我在callback(null, 'two');行中收到错误“回调不是函数” 老实说,这也可能是一个非常愚蠢的问题,我并不完全了解异步瀑布的工作原理。但我确实尝试过,通过阅读示例,尝试实现短代码并尝试使用它。

有趣的是,如果使用 async.series 而不是 async.waterfall,则不会出现此类错误。但是 async.series 将打印 1、2、3、3、1、2。瀑布模型里面的数字是按顺序打印的,但是里面的函数没有按照正确的顺序执行。

需要注意的是,前两个功能 - 设置和配置文件 - 包括 db 读取和计算,而第三个功能仅打印一些结果。

why*_*yie 5

为了简化它,callback(null, 'one')意味着您将一个参数传递给下一个参数。这意味着您的函数需要在回调前面接受 1 个参数。

callback(null, 'one')接下来是function(arg1, callback)哪里arg1 = 'one'

callback(null, 'one', 'two')接下来是function(arg1, arg2, callback)哪里arg1='one'arg2='two'

async.waterfall([
    function(callback) {
      settings();
      console.log("1");
      callback(null, 'one');
    },
    function(arg1, callback) {
      profile();
      console.log("2");
      callback(null, 'two');
    },
    function(arg1, callback) {
        console.log("3");
        groups();
        callback(null, 'two');
    }
  ]);
Run Code Online (Sandbox Code Playgroud)


小智 5

使用async.waterfall,结果将作为参数传递给下一个函数。例如:

async.waterfall([
    function(callback) {
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback) {
        // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback) {
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
    // result now equals 'done'
});
Run Code Online (Sandbox Code Playgroud)

在您的情况下,callback第二个函数将接收字符串one作为参数。因此,您遇到的错误。