首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步回调不是一个函数。

异步回调不是一个函数。
EN

Stack Overflow用户
提问于 2016-10-26 18:24:33
回答 5查看 10.8K关注 0票数 1

我试图在节点js中使用异步,以控制某些函数的执行流程。在下面的代码中,我有三个声明的函数,它们分别打印“1”、“2”和“3”,同时执行其他任务(只有这样,我才能看到什么时候执行)。

代码语言:javascript
复制
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');
    }
  ]);

因此,我得到了回调行中的错误“回调不是函数”(null,‘2’);老实说,可能是一个非常愚蠢的问题,而且我也不完全理解异步瀑布是如何工作的。但我确实尝试过,通过阅读示例,尝试实现简短的代码,并尝试使用它。

有趣的是,如果使用async.series而不是async.waterfall,就没有这样的错误。然而,async.series将打印1,2,3,3,1,2。瀑布模型内的数字按顺序打印,但内部的函数没有按正确的顺序执行。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-10-26 18:37:20

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

代码语言:javascript
复制
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'
});

在您的示例中,第二个函数上的callback将接收字符串one作为参数。因此,你所经历的错误。

票数 5
EN

Stack Overflow用户

发布于 2016-10-26 18:34:49

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

callback(null, 'one')后面跟着function(arg1, callback),其中arg1 = 'one'

callback(null, 'one', 'two')function(arg1, arg2, callback)并驾齐驱arg1='one'arg2='two'

代码语言:javascript
复制
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');
    }
  ]);
票数 4
EN

Stack Overflow用户

发布于 2016-10-26 19:00:55

瀑布

首先,我建议您使用异步自动代替瀑布模型,原因是在瀑布模型中,我们将一个接一个地移动,首先我们将完成第一个函数的执行,然后再转到第二个,然后第三个,即,不管我们的功能是否相互依赖,我们都会进行一个系列。

自动

auto的好处在于,如果您的函数是相互依赖的,这并不重要,因为auto可以串联运行任务(对于依赖函数)和并行任务(对于不相互依赖的函数)。

代码语言:javascript
复制
async.auto({
    get_data: function(callback) {
        console.log('in get_data');

        callback(null);
    },
    make_folder: function(callback) {

        callback(null);
    },
    write_file: ['get_data', 'make_folder', function(results, callback) {

        callback(null);
    }],
    email_link: ['write_file', function(results, callback) {

        callback(null);
    }]
}, function(err, results) {

});

在上面的例子中,我们有不相互依赖的get_Data函数和make_folder函数,因此我们可以并行地运行它们,通过传递get_Data & make_folder的名称,我们可以将write_file函数限制为只在执行上述两个函数之后才能运行。

有关更多详细信息,请访问http://caolan.github.io/async/docs.html#auto

甚至看一看async.autoInject,它最近被添加到异步而不是auto。但是auto将继续用于异步的珍贵版本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40269584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档