回调不是一个函数
我正在尝试在节点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