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 读取和计算,而第三个功能仅打印一些结果。
为了简化它,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作为参数。因此,您遇到的错误。