在 JavaScript 中限制 "in-flight" 异步调用

Limiting "in-flight" asynchronous calls in JavaScript

我在 JavaScript 中进行了一些异步调用。我想确保在任何时候都只有一个异步调用在进行中。我怎样才能做到这一点?

Q 库是否公开了与此相关的内容?

这取决于您是要保留所有通话还是放弃任何在飞行途中拨打的电话。

如果要保留所有调用,则不应直接进行 Ajax 调用,而应将它们放入队列中。然后队列抽象将负责进行 Ajax 调用,使用锁变量检查一个是否已经在运行中。当收到 Ajax 呼叫或超时时,它可以触发队列检查任何未决呼叫,以便可以触发下一个呼叫。

如果你想放弃在飞行中进行的呼叫,一个简单的锁定机制就可以了。对于任何调用,只需检查锁是否为真,如果不是,则触发请求并将锁设置为真。如果锁定为真,什么都不做(丢弃它)。来电或超时清锁

我不是 Q 用户,但 Q 本质上是一个实现承诺的库,因此您可以通过将一系列 .then 子句链接在一起来确保这一点,每个子句包含一个调用,或者从.done 上一个 AJAX 调用的操作。

我能想到的是使用函数队列根据 jQuery.active 的结果处理 ajax 函数,它计算活动的异步调用。

因此,当调用 ajax 函数时,检查活动 ajax 运行,如果它是 1,则将您的函数添加到队列中,否则执行它。

然后您可以使用 ajaxStop 函数触发队列中任何剩余函数的调用,调用该函数并将其从队列中删除。

通过这种方式,您将确保单个 ajax 调用运行。这只是一些头脑风暴,我还没有测试确切的行为,但这种方法可能会有所帮助。