Javascript 按顺序运行Ajax

Javascript 按顺序运行Ajax,javascript,jquery,ajax,for-loop,Javascript,Jquery,Ajax,For Loop,只是想知道如何确保Ajax in-for循环按顺序返回值。例如,我有以下代码: for(var i=0; i < list.length; i++) { $.ajax({ url: ..., type: 'get', dataType: "jsonp", success: function(data) { ... var html = '...'; $('#some-div').append(html); })

只是想知道如何确保Ajax in-for循环按顺序返回值。例如,我有以下代码:

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

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

他们不会按顺序返回,这超出了您的控制范围,除非您按顺序排队(这会减慢整个过程)但这并不意味着不能按正确的顺序组合结果

添加一个作用域函数,并使用一个临时容器(按顺序)立即追加,并在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);
}
for(变量i=0;i
作用域函数立即执行,将
i
作为本地
i
参数传递(如果需要)。这就是他们所称的IIFE(立即调用的函数表达式)

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


注意:
@Rooster
指出,通常最好使用一个Ajax调用返回多个项目(已按顺序返回)。

一般来说,在第一个请求成功时调用第二个请求,在第二个请求成功时调用第三个。依此类推

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.
var url=[”http://www.google.com", ...];
函数callAjax(ajaxReqId){
$.ajax({
url:url[ajaxReqId],//将url保存在一个数组中,从数组中获取url,并将收到的索引作为参数。
键入:“get”,
数据类型:“jsonp”,
成功:功能(数据){
...
var html='…';
$('#some div').append(html);
//一旦成功,我们准备好进行下一个ajax调用。
ajaxReqId++;//因此,我们增加索引
if(ajaxReqId
这应该对你有帮助

编辑:
请注意:这仍然是异步的,并且按照您的意愿执行任务…在继续下一个请求之前等待前面请求的响应。

除非您将请求链接为一个接一个地运行,否则无法100%保证它们的执行顺序。它们将按顺序1、2、3发送到服务器,但服务器可能不会接收到或者按照这个顺序处理它们,处理时间也可能会有所不同,因此响应可能会以2、3、1的形式返回。如果可能的话,我会尝试将这些请求都合并到一个请求中。在这样的循环中看到ajax通常是一个危险信号。@john26blue检查我的答案,它应该会起作用。这种技术的缺点是会降低总体速度通过链接负载进行处理。使用占位符并在返回时填写占位符的响应速度要快得多。是的……但要在连续执行一个接一个的ajax请求,我看不到任何其他选项。如果我缺少什么,请让我知道……查看我的备选答案。如果最终结果只是显示顺序,占位符将不起作用他耍了个小把戏。非常感谢。这就是我要找的。代码很简单,但我搞不懂:DYou是受欢迎的:)我添加了更多的注释,以便更容易理解逻辑。很抱歉,我不知道为什么它对我不起作用。无论如何,非常感谢你帮助我。@john26blue:如果有疑问,请用您正在尝试的。只需一个输入错误(您的或我的)即可使其停止工作:)