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



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

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

这取决于您是想保留所有呼叫还是放弃在飞行中拨打的任何呼叫。

如果希望保留所有调用,则不应该直接进行Ajax调用,而应该将它们放在队列中。然后,队列抽象将负责进行Ajax调用,使用一个锁变量来检查是否有一个已经在运行中。当Ajax调用被接收或超时时,它可以触发队列来检查是否有任何挂起的调用,以便可以启动下一个调用。

如果你想丢弃一个正在运行的调用,一个简单的锁机制就可以了。对于任何调用,只需检查锁是否为真,如果不是,则触发请求并将锁设置为真。如果锁为真,什么都不做(丢弃它)。

在收到呼叫或超时时清除锁定。

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

我能想到的是使用一个函数队列来处理基于jQuery结果的ajax函数。活动,对活动异步调用进行计数。

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

你可以使用ajaxStop函数触发任何剩余的函数在队列中被调用,调用该函数并将其从队列中移除。

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

最新更新