我试图在节点js中使用异步,以控制某些函数的执行流程。在下面的代码中,我有三个声明的函数,它们分别打印“1”、“2”和“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,‘2’);老实说,可能是一个非常愚蠢的问题,而且我也不完全理解异步瀑布是如何工作的。但我确实尝试过,通过阅读示例,尝试实现简短的代码,并尝试使用它。
有趣的是,如果使用async.series而不是async.waterfall,就没有这样的错误。然而,async.series将打印1,2,3,3,1,2。瀑布模型内的数字按顺序打印,但内部的函数没有按正确的顺序执行。
需要注意的是,前两个函数--设置和配置文件--包括db读取和计算,而第三个函数只打印一些结果。
发布于 2016-10-26 18:37:20
对于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作为参数。因此,你所经历的错误。
发布于 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'
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');
}
]);发布于 2016-10-26 19:00:55
瀑布
首先,我建议您使用异步自动代替瀑布模型,原因是在瀑布模型中,我们将一个接一个地移动,首先我们将完成第一个函数的执行,然后再转到第二个,然后第三个,即,不管我们的功能是否相互依赖,我们都会进行一个系列。
自动
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,它最近被添加到异步而不是auto。但是auto将继续用于异步的珍贵版本。
https://stackoverflow.com/questions/40269584
复制相似问题