我正在处理的应用程序必须触发对外部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();
}
}
此代码能按我预期的那样工作吗?所有结果都将进入队列并按顺序触发其回调吗?如果不是,为什么?
编辑:这种情况的用例是这些响应的回调本身将启动一个进程,该进程应仅同步处理而不是异步处理(更新为存储状态)。
答案 0 :(得分:2)
对于任何遇到这个问题并遭受我相同误解的人,似乎这个问题源于对Java语言中异步处理方式的误解。从硬件的角度来看,多个线程不是真正的“处理线程”,而只是循环排队的代码块,直到所有块完成为止。因此,在我的示例中,队列仍在处理时,什么也不能添加到队列中,因为所有处理都在同一事件循环中进行。
我在这篇文章中找到了很好的解释:How Javascript Works(“剖析事件循环”部分),并且有关于并发模型和事件循环MDN page的其他信息。