跨多个函数将回调串联在一起

Stringing Callbacks together across multiple functions

提问人:user2828701 提问时间:10/26/2023 最后编辑:evolutionxboxuser2828701 更新时间:10/27/2023 访问量:46

问:

我想使用回调将函数串联在一起 - 我仍在努力学习。从本质上讲,我希望函数按照 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())

JavaScript 回调

评论

1赞 evolutionxbox 10/26/2023
callback2未定义。所有函数均不返回任何内容。此外,函数会立即调用,而不是传递。
1赞 zGilexx 10/26/2023
callback2 不存在,对于 a,callback 是 b,对于 b 没有回调,它必须是: a(b(callbackhere));
0赞 Diego D 10/26/2023
也许知道函数是 JS 中的数据类型并且这些参数确实应该包含这种数据类型会有所帮助。 正在调用传递 的返回值。当定义这样的函数时,您实际上是将函数对象存储在一个名为函数名称的变量中。所以也许你想做......但我没有走得更远a(b())ab()a(b)
1赞 Diego D 10/26/2023
教训是不要只是随意尝试。了解 JS 函数!
1赞 VLAZ 10/26/2023
相关:函数调用和函数引用有什么区别?

答:

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(),那么只有它会转到第二个函数,然后转到第三个函数,依此类推。最后,它到达函数错误部分,如果有错误,您可以将错误传递给回调以从那里退出。检查一下这将是更好、更干净的方式来满足您的要求。