gpt4 book ai didi

javascript - 使用队列处理异步回调

转载 作者:行者123 更新时间:2023-11-30 14:25:18 25 4
gpt4 key购买 nike

我正在处理的应用程序必须向外部 API 发出多个请求。它将异步接收这些请求的结果,但我需要以同步方式处理每个响应。我的研究告诉我有多种方法可以做到这一点,但我正在考虑这个想法并想知道它是否可行:

每次我调用外部API,它的响应一异步返回就进入队列:

function genericFetchFunction(url, callback) {
makeAsyncRequest(url, (result) => {
addToHandlingQueue({
data: result,
callback
});
});
}

队列处理程序将响应推送到队列,并启动队列触发过程。

const responseQueue = [];

function addToHandlingQueue(response) {
responseQueue.push(response);
if (responseQueue.length == 1) {
fireQueue();
}
}

function fireQueue() {
let item = responseQueue.shift();
item.callback(item.data);
if (responseQueue.length > 0) {
fireQueue();
}
}

这段代码能按我预期的那样工作吗?所有结果都会进入队列并按顺序触发它们的回调吗?如果不是 - 为什么不呢?

编辑:这个用例是这些响应的回调本身将启动一个应该只同步处理而不是异步处理的过程(对存储状态的更新)。

最佳答案

对于任何遇到这个问题并遭受同样误解的人来说,这个问题似乎源于对 Javascript 中异步处理方式的误解。多线程在硬件意义上并不是真正的“处理线程”——而只是排队的代码块,这些代码块被迭代直到完成所有 block 。因此,在我的示例中,当队列仍在处理时,不能向队列添加任何新内容,因为该处理全部发生在同一个事件循环中。

我在这篇文章中找到了很好的解释:How Javascript Works (“剖析事件循环”部分)还有关于并发模型和事件循环的附加信息 MDN page .

关于javascript - 使用队列处理异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52045199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com