提问人:user2828701 提问时间:10/26/2023 最后编辑:evolutionxboxuser2828701 更新时间:10/27/2023 访问量:46
跨多个函数将回调串联在一起
Stringing Callbacks together across multiple functions
问:
我想使用回调将函数串联在一起 - 我仍在努力学习。从本质上讲,我希望函数按照 a、b 和 c 的顺序一个接一个地执行。当我运行下面的基本代码时,我的输出是
投票 B 投票 A
轮询 C 永远不会返回。
我做错了什么,导致订单错误并且 c 永远不会被退回?
function a(callback) {
console.log('poll a')
if (callback) {
callback(b())
}
}
function b(callback2) {
console.log('poll b')
if (callback2) {
callback2(c());
}
}
function c() {
console.log('poll c')
}
a(b())
答:
1赞
Vidyashree
10/27/2023
#1
在上面的代码中,您在 a 的函数调用中调用 b,该函数调用首先调用函数 b 并打印“poll b”。但是这里没有传递给函数 b 的参数,因此回调将为空,因此条件变为 false,并且不会调用函数 c。此处 b 的返回值将为 null。
一旦函数 b 被执行并返回 null,函数 a 将被调用为 a(null)。在执行函数 a 时,接下来将打印“poll a”,并检查回调变量的真实性。由于 callback 为 null,因此条件再次失败,并且在调用 a 后执行停止。
因此,代码需要稍作修改才能以指定的方式工作。
function a(callback) {
console.log('poll a')
if (callback) {
callback(c)
}
}
function b(callback2) {
console.log('poll b')
if (callback2) {
callback2();
}
}
function c() {
console.log('poll c')
}
a(b)
上面的代码将根据需要打印输出。
0赞
Abhishek
10/27/2023
#2
async.waterfall([
function (callback) {
console.log('poll a')
callback();
}, function (callback) {
console.log('poll b')
callback();
}, function (callback) {
console.log('poll c')
callback();
}
], function (err) {
console.log('poll Finished')
callback(err);
});
使用异步包。在异步库中,有一种方法可以:
async.waterfall
使用它,您可以添加尽可能多的函数并在串联/瀑布模型中运行它(假设函数 a,然后是 b,然后继续)。就像上面的代码片段一样,添加尽可能多的函数,一旦调用 callback(),那么只有它会转到第二个函数,然后转到第三个函数,依此类推。最后,它到达函数错误部分,如果有错误,您可以将错误传递给回调以从那里退出。检查一下这将是更好、更干净的方式来满足您的要求。
评论
callback2
未定义。所有函数均不返回任何内容。此外,函数会立即调用,而不是传递。a(b())
a
b()
a(b)