【问题标题】:Maintain order of requests when making several ajax callbacks在进行多个 ajax 回调时保持请求的顺序
【发布时间】:2010-12-06 21:48:37
【问题描述】:

我正在遍历几个项目并为每个项目发出 ajax 请求(使用 jQuery)。我希望它们独立执行,但按照它们被调用的顺序填充到 DOM 中,而不是它们返回的顺序(由于某种原因,某些请求比其他请求花费的时间更长)。有关此类事情的最佳实践的任何提示?

【问题讨论】:

  • 为每个附加一个请求顺序字段并将数据存储在一个全局内存位中(可能附加到一个“持有 div”),并在每次成功调用一个公共模块,该模块将尝试加载如果都成功了。听起来您将有相当多的互斥锁来保存此设计的模式。 ~~ 至于最佳实践,只要保持代码干净可读即可。

标签: ajax jquery


【解决方案1】:

结果可以以任何未定义的顺序返回,它们是异步的并且受制于互联网和服务器的变幻莫测。

您可以用 TCP 通过 UDP 处理问题的方式来处理该问题。您使用序列标识符。

保持序列标识符继续运行,并在每次发出请求时递增。当请求返回时,按顺序检查它们,并仅在它们进入时处理它们。按顺序保存已返回数据的列表,并在每次更新后例行检查该列表。当第一个预期出现时,它应该将整个列表处理到第一个间隙。

请记住,您可能会丢失请求,因此在忽略给定序列标识符之前有一个合适的超时时间。

【讨论】:

    【解决方案2】:

    这个问题的答案最终是一个名为 ajaxManager 的 jQuery 插件。这正是我所需要的:

    https://github.com/aFarkas/Ajaxmanager

    【讨论】:

      【解决方案3】:

      您可以将所有成功结果对象发送到队列。拥有与原始请求一起发送的索引,并不断检查该队列以获取下一个索引。

      但通常浏览器只允许两个同时的 ajax 请求,因此在前一个请求成功时发送下一个 ajax 请求可能是值得的。

      这是代码的开始:

      var results = {}, lastProcessedIndex = 0;
      var totalLength = $('a.myselector').each(function(el, index){
          $.ajax({
              url: $(this).attr('href'),
              success: function(result){
                  results[index] = result; // add to results object
              }
          });
      }).length;
      
      var intervalId = setInterval(function(){
          if(results[lastProcessedIndex]){
              // use object
              lastProcessedIndex++;
          }
          else if(totalLength == lastProcessedIndex){
              clearInterval(intervalId); 
          }
      }, 1000); // every 1 second
      

      【讨论】:

      【解决方案4】:

      我会用这个在黑暗中试一试,但它可能会有所帮助。也许您可以创建一个全局缓冲区数组,然后每当 AJAX 返回时,您都可以将结果添加到缓冲区中。然后,您可以设置一个计时器,该计时器在触发时将检查缓冲区的内容。如果它们是有序的,它将相应地输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        相关资源
        最近更新 更多