在Javascript中是否有任何消息优先排序?

时间:2011-12-22 12:34:58

标签: javascript asynchronous priority-queue

当我在javascript中进行一些异步调用时,我将回调函数放入某个队列,对吗?

我可以以某种方式控制放置功能的队列位置吗?明确地或通过某种优先权?

更新1

我的问题不仅仅是关于AJAX。有几个地方在JS中使用异步调用(我可能错了):

  1. 事件处理程序
  2. XMLHttpRequest调用
  3. 的setTimeout()/的setInterval()
  4. 根据回复,我认为一般答案是否定的,即无法从javascript访问消息队列。

2 个答案:

答案 0 :(得分:3)

没有。浏览器不维护异步请求的实际队列。并非所有浏览器都必须以相同的方式处理它,但从概念上讲,浏览器只是暂停处理请求的线程,直到对该请求的响应返回或计时器到期为止。此时,它将使用响应提供的数据继续执行回调中的线程。我确信我已经过度简化了,但是根据我们正在讨论的浏览器,答案可能会有所不同。

如果您想要对AJAX请求进行排序,则需要构建机制或找到现有的JavaScript插件/库来执行此操作。最简单的方法可能只是在应该优先处理的请求的回调中进行后续请求。这样你就知道它们会比它们之前应该发生的更晚出现。当然,计时器在它们到期时会调用它们的回调。如果需要,您可以通过小心过期时间来订购它们。

答案 1 :(得分:1)

您可以做的一件事是在每个请求(和响应)中包含一个序列号,并为每个AJAX调用使用相同的回调处理程序。这样,您的回调处理程序可以检查返回的序列号并管理回调的执行顺序。

即。类似的东西:

每个AJAX请求都会像/getUsers?seq=1&.../getProps?seq=2&...等。

每个AJAX响应(假设这里是JSON)将返回随请求一起收到的seq数,即

result {
  seq: 2,
  data: ...
}

那么你的回调处理程序将类似于:

var responseQ = [];
function handler(response) {
  // .. code to push the response into the responseQ in increasing order of seq num ..
}

你可以让队列处理器每N秒执行一次,检查Q中未完成的响应并相应地处理它们。

即。类似的东西:

setInterval(function() {

  // get last item from responseQ
  // check its seq num  
  // execute if appropriate

}, 10000);