【问题标题】:Running Ajax in order按顺序运行 Ajax
【发布时间】:2015-04-09 15:38:26
【问题描述】:

只是想知道如何确保 for 循环中的 Ajax 按顺序返回值。例如,我有这样的代码:

for(var i=0; i < list.length; i++) {
  $.ajax({
    url: ...,
    type: 'get',
    dataType: "jsonp",
    success: function(data) {
      ...
      var html = '...';
      $('#some-div').append(html);
    })
}

当我运行它时,结果有时会以正确的顺序运行,但有时却不会。我不知道该怎么办。请有人帮我解决这个问题。谢谢!

【问题讨论】:

  • 除非您将请求一个接一个地链接起来,否则无法 100% 保证它们的执行顺序。它们将按 1、2、3 的顺序发送到服务器,但是服务器可能不会按该顺序接收或处理它们,并且处理时间也可能会有所不同,因此响应可能会在 2、3、1 中返回.
  • 如果可能的话,我会尝试将这些请求合并为一个。在这样的循环中看到 ajax 通常是一个危险信号。
  • @john26blue 检查我的答案,它应该可以工作。

标签: javascript jquery ajax for-loop


【解决方案1】:

它们不会按顺序返回,这是您无法控制的,除非您按顺序排列调用(这会减慢整个过程),但这并不意味着您不能在正确的顺序

添加一个作用域函数并使用一个临时容器(按顺序)立即附加并在 Ajax 完成后填充:

for(var i=0; i < list.length; i++) {
  function(i){
      var $div = $('<div>');
      $('#some-div').append($div);
      $.ajax({
       url: ...,
       type: 'get',
       dataType: "jsonp",
       success: function(data) {
         ...
         var html = '...';
         $div.append(html);
    })
  }(i);
}

作用域函数立即执行,将i 作为本地i 参数传递(如果需要)。这就是他们所说的 IIFE(立即调用函数表达式)。

或者,然后您可以使用i 的值来确定插入特定结果的顺序。我个人喜欢第一个“占位符”选项。

注意:正如@Rooster 指出的那样,您通常最好进行一次返回多个项目(已经按顺序)的 Ajax 调用。

【讨论】:

  • 很抱歉,但我不知道为什么它对我不起作用。无论如何,非常感谢你帮助我。
  • @john26blue:如有疑问,请使用您正在尝试的内容扩展您的答案。只需要一个错字(你的或我的)就可以让它停止工作:)
【解决方案2】:

通常要做到这一点,您必须在第一个请求成功时调用第二个请求,在第二个请求成功时调用第三个......等等......

var urls = ["http://www.google.com", ...];
function callAjax(ajaxReqId){
   $.ajax({
    url: urls[ajaxReqId], //keep your urls in an array, Take the URL from the array with the index received as parameter.
    type: 'get',
    dataType: "jsonp",
    success: function(data) {
      ...
      var html = '...';
      $('#some-div').append(html);

      //On success, we are ready to go to next ajax call.
      ajaxReqId++; //So, we increment the index
      if(ajaxReqId < urls.length) //Ensure that we don't cross the maximum requests we intent to call.
          callAjax(ajaxReqId); //Call the same function we used to call request 1. Just with incremented Id.
    })
}

callAjax(0); //Call the very first ajax request by index.

这应该可以帮助你...

编辑: 请注意:这仍然是异步的,可以按照您的意愿完成工作...在继续下一个请求之前等待先前请求的响应。

【讨论】:

  • 这种技术的缺点是通过链接负载会减慢整个过程。使用占位符并在返回时填写它们的响应速度要快得多。
  • 是的...但是要一个接一个地执行ajax请求...我没有看到任何其他选项。如果我遗漏了什么,请告诉我...
  • 查看我的替代答案。如果最终结果只是显示顺序,占位符就可以解决问题。
  • 非常感谢。这就是我要找的。代码很简单,但我不知道:D
  • 不客气 :) 我添加了更多的 cmets,以便更容易理解逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2017-10-18
  • 2020-06-11
相关资源
最近更新 更多