2011-12-22 48 views
0

当我在javascript中进行一些异步调用时,我将回调函数放入某个队列中,对吗?在Javascript中有任何消息优先级吗?

我可以控制放置函数的队列位置吗?显式或按优先级?

更新1

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

  1. 事件处理
  2. 的XMLHttpRequest调用
  3. 的setTimeout()/的setInterval()

根据回复,我认为一般答案是NO,即消息队列不能从javascript访问。

+1

哪里的JavaScript允许把回调异步请求到队列的功能? – Gumbo 2011-12-22 12:41:19

+0

@Gumbo:你为什么要重复这个问题? – 2011-12-22 13:40:30

+0

@ TomalakGeret'kal我以Dims假定已经有一个请求回调队列并且他不知道如何确定其元素优先级的方式解释这个问题。 – Gumbo 2011-12-22 13:52:10

回答

3

否浏览器不维护异步请求的实际队列。并非所有的浏览器都必须以相同的方式处理它,但从概念上讲,浏览器只是挂起正在处理请求的线程,直到对该请求的响应返回或定时器到期。此时,它会继续使用响应提供的数据执行回调中的线程。我敢肯定,我已经简化了它,但更详细的答案可能会有所不同,具体取决于我们正在讨论的浏览器。

如果您想为您的AJAX请求订购,您需要构建机制或找到现有的JavaScript插件/库来执行此操作。最简单的方法可能只是在应该优先考虑的请求的回调中进行后续请求。这样你就知道它们会晚于应该在它们之前出现的时间。定时器当然会在到期时调用它们的回调函数。如果需要,您可以订购它们,注意过期时间。

+1

不需要构建自己的实现,只需使用可用的(并经过良好测试)。例如,一个jQuery插件(http://docs.jquery.com/AjaxQueue)或一个独立的JavaScript引擎(http://www.cmarshall.net/MySoftware/ajax/index.html)。 – lsoliveira 2011-12-22 13:35:12

+0

@lsoliveira是的,通过“构建”我只是指使用JavaScript编写的代码而不是浏览器实现。使用现有的插件可能是最好的方法,尤其是如果您已经在使用该插件的框架。 – tvanfosson 2011-12-22 13:37:51

+0

同意。只是想让OP知道有其他选择。无论哪种方式,再次阅读问题,我甚至不知道它是否引用了AJAX调用(而不是作为由setTimeout/setInterval触发的定时器的一部分执行的回调)。 – lsoliveira 2011-12-22 14:29:24

1

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

即是这样的:

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

每个Ajax响应(假设JSON这里)将返回SEQ NUM收到该请求,即

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); 
+0

如果OP想要对请求进行排队的原因是串行化服务器访问(例如,richfaces执行此操作),那么这将不起作用(或者至少必须严重扩展)。 – lsoliveira 2011-12-22 14:27:05

+0

是的,这将不得不扩大一点。我只是指出了制定AJAX排队策略的高层战略大纲。 – techfoobar 2011-12-22 14:39:15