回调不是一个函数

我正在尝试在节点js中使用异步,以控制某些函数的执行流程。 在下面的代码中,我有三个声明的函数,应该分别打印'one','two'和'3',并执行其他任务(打印只是为了让我看到什么时候执行)。

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,'two'); 说实话,这可能是一个虚拟的问题,我不完全理解async瀑布是如何工作的。 但是我认真地尝试了一下,通过阅读例子,试图实现短代码并试着玩弄它。

有趣的是,如果使用async.series代替async.waterfall,则不会出现这样的错误。 但是,async.series将打印1,2,3,三,一,二。 瀑布模型中的数字按顺序打印,但里面的函数不按正确的顺序执行。

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


使用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'
});

在你的情况下,第二个函数的callback函数将收到字符串one作为参数。 因此,你正在经历的错误。


为了简化它, callback(null, 'one')表示你将一个参数传递给next。 含义你的功能需要在回调前接受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');
    }
  ]);

瀑布

首先我建议你使用Async auto来代替瀑布模型,这是因为在瀑布模型中,我们将像前一个一样移动,我们将完成第一个函数的执行,然后继续前进到第二个和第三个,即我们将无论天气如何,我们的功能都是相互依赖的

汽车

auto的好处是它并不重要,因为你的函数相互依赖,因为auto可以按顺序运行任务(用于依赖函数)和并行(用于不依赖于彼此的函数)

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它最近被添加到async代替auto。 但汽车将继续为异步的宝贵版本

链接地址: http://www.djcxy.com/p/55489.html

上一篇: callback is not a function

下一篇: nodeJS design pattern to break out of a async.waterfall or promise.then.then