Javascript中是否存在任何消息优先级?

Javascript中是否存在任何消息优先级?,javascript,asynchronous,priority-queue,Javascript,Asynchronous,Priority Queue,在javascript中进行异步调用时,我将回调函数放入某个队列中,对吗 我可以控制放置函数的队列位置吗?明确地还是优先地 更新1 我的问题不仅仅是关于AJAX。JS中使用异步调用的地方有几个(我可能错了): 事件处理程序 XMLHttpRequest调用 setTimeout()/setInterval() 根据答复,我认为一般的答案是否定的,即消息队列不能从JavaScript访问。 < P>不。浏览器不维护实际的异步请求队列。并非所有浏览器都必须以相同的方式处理该请求,但从概念上讲,浏览器

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

我可以控制放置函数的队列位置吗?明确地还是优先地

更新1

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

  • 事件处理程序
  • XMLHttpRequest调用
  • setTimeout()/setInterval()

  • 根据答复,我认为一般的答案是否定的,即消息队列不能从JavaScript访问。

    < P>不。浏览器不维护实际的异步请求队列。并非所有浏览器都必须以相同的方式处理该请求,但从概念上讲,浏览器只是暂停处理该请求的线程,直到对该请求的响应返回或计时器过期。此时,它将使用响应提供的数据继续执行回调中的线程。我敢肯定我把它简化了,但是如果有更多的细节,答案可能会因我们讨论的浏览器而异


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

    否。浏览器不维护异步请求的实际队列。并非所有浏览器都必须以相同的方式处理该请求,但从概念上讲,浏览器只是暂停处理该请求的线程,直到对该请求的响应返回或计时器过期。此时,它将使用响应提供的数据继续执行回调中的线程。我敢肯定我把它简化了,但是如果有更多的细节,答案可能会因我们讨论的浏览器而异


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

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

    i、 e.类似于:

    var responseQ = [];
    function handler(response) {
      // .. code to push the response into the responseQ in increasing order of seq num ..
    }
    
    setInterval(function() {
    
      // get last item from responseQ
      // check its seq num  
      // execute if appropriate
    
    }, 10000);
    
    每个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 ..
    }
    
    setInterval(function() {
    
      // get last item from responseQ
      // check its seq num  
      // execute if appropriate
    
    }, 10000);
    
    您可以让队列处理器每N秒执行一次,它检查Q中的未完成响应并相应地处理它们

    i、 e.类似于:

    var responseQ = [];
    function handler(response) {
      // .. code to push the response into the responseQ in increasing order of seq num ..
    }
    
    setInterval(function() {
    
      // get last item from responseQ
      // check its seq num  
      // execute if appropriate
    
    }, 10000);
    

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

    i、 e.类似于:

    var responseQ = [];
    function handler(response) {
      // .. code to push the response into the responseQ in increasing order of seq num ..
    }
    
    setInterval(function() {
    
      // get last item from responseQ
      // check its seq num  
      // execute if appropriate
    
    }, 10000);
    
    每个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 ..
    }
    
    setInterval(function() {
    
      // get last item from responseQ
      // check its seq num  
      // execute if appropriate
    
    }, 10000);
    
    您可以让队列处理器每N秒执行一次,它检查Q中的未完成响应并相应地处理它们

    i、 e.类似于:

    var responseQ = [];
    function handler(response) {
      // .. code to push the response into the responseQ in increasing order of seq num ..
    }
    
    setInterval(function() {
    
      // get last item from responseQ
      // check its seq num  
      // execute if appropriate
    
    }, 10000);
    

    JavaScript允许在哪里将异步请求的回调函数放入队列?@Gumbo:你为什么要重复这个问题?@TomalakGeret'kal我对这个问题的解释是,Dims假设已经有一个请求回调队列,他只是不知道如何对其元素进行优先级排序。@Gumbo:他的第一个问题的答案子问题“[…],对吗?”会解决的。秋葵,请参阅我的更新1,了解我对JS中异步调用位置的看法JavaScript允许将异步请求的回调函数放入队列中的位置?@Gumbo:为什么要重复这个问题?@TomalakGeret'kal我对这个问题的解释是,Dims假设已经有一个用于请求回调的队列,而他只是不知道如何对其元素进行优先级排序。@Gumbo:他的第一个子问题“[…],对吗?”的答案将解决这个问题。Gumbo,请参阅我的更新1,了解我对异步调用在JSF中的位置的看法。没有必要构建自己的实现,只需使用一个现成的(经过良好测试的)实现即可。例如,jQuery插件()或独立javascript引擎()。@lsoliviera是的,我所说的“构建”只是指使用javascript编写的代码,而不是浏览器实现。使用现有的插件可能是最好的方法,特别是如果您已经在使用插件所使用的框架。只是想让OP知道还有其他选择。不管怎样,再次阅读这个问题,我甚至不确定它是否涉及AJAX调用(与使用setTimeout/setInterval触发的计时器中执行的回调相反)。如果同时发生多个事件呢?例如,用户按下按钮和ajax响应来了吗?或者用户在超时的同时移动鼠标?如果没有队列,则其中一个事件将丢失。所以,我完全不同意