使用队列处理异步回调

时间:2018-08-27 18:38:44

标签: javascript asynchronous design-patterns

我正在处理的应用程序必须触发对外部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();
    }
}

此代码能按我预期的那样工作吗?所有结果都将进入队列并按顺序触发其回调吗?如果不是,为什么?

编辑:这种情况的用例是这些响应的回调本身将启动一个进程,该进程应仅同步处理而不是异步处理(更新为存储状态)。

1 个答案:

答案 0 :(得分:2)

对于任何遇到这个问题并遭受我相同误解的人,似乎这个问题源于对Java语言中异步处理方式的误解。从硬件的角度来看,多个线程不是真正的“处理线程”,而只是循环排队的代码块,直到所有块完成为止。因此,在我的示例中,队列仍在处理时,什么也不能添加到队列中,因为所有处理都在同一事件循环中进行。

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