2013-04-03 75 views
0

这是我的代码:Ajax请求的循环

for (var i = 0; i < 20; i++) { 
$.ajax({ 
    type: "GET", 
    async: false, 
    url: "/MyController/MyMethod", 
    success: function (data) { 
     if (i == 0) { 
      $('#result_progress').hide(); 
      $('#result_msg').hide(); 
      $('#details').show(); 
     } else if (i == 1) { 
      $.ajax({ 
      type: "GET", 
      async: true, 
      url: "/Import/Finish", 
      success: function (data) { 
        ....       
      });            
     } 
     if (i < 2) { 
      $('#details').html($('#details').html() + 'someText')); 
     }           
    } 
}); 

}

我不想使用异步:因为我的浏览器停止工作错误。我会如何解决这个问题?

+0

你不想使用同步请求,但Ajax请求应该还是按顺序? –

+0

@FelixKling同步和顺序是不一样的东西 – NimChimpsky

+0

@FelixKling那么MyMethod有一个输入参数依赖于我,所以是的。 –

回答

0

以下是我固定它:

function run(i, howManyToRun, start) { 
    if(i >= howManyToRun) return; 

    $.ajax({ 
     type: "GET", 
     async: false, 
     url: "/MyController/MyMethod", 
     success: function (data) {   
      .... 
      run(++i, howManyToRun, start); 
      ....          
     } 
    }); 
} 
0

您的问题是i具有执行回调时的循环结束值。

的标准溶液,以解决这个问题是增加一个中间立即调用的函数,以保护的i值:

for (var i = 0; i < 20; i++) { 
    (function(i){ 
     ... your code 
    })(i); 
} 

给函数的调用创建一个范围,其中i是一个不同的变量。

+0

你是对的,但这似乎不是OP所要求的;) –

+0

@FelixKling我不确定。我不会像你一样阅读这个问题(我见过你的其他评论)。顺便说一句,我没有找到通常的问题,我会关闭重复。我相信你有一个链接... –

+0

哦,现在我明白了......你认为OP由于'i'使用'async:false'。也许你应该明确提到将它设置为'false'不再需要。如果OP想按顺序运行请求,我会搜索一些延迟对象解决方案... –

0

我想你应该有一些封闭做到这一点:

function makeReq(n){ 
    return function(){ 
     $.ajax({ 
     type: "GET", 
     async: true, 
     url: "/MyController/MyMethod", 
     success: function (data) { 
      if (n == 0) { 
       $('#result_progress').hide(); 
       $('#result_msg').hide(); 
       $('#details').show(); 
      } else if (n == 1) { 
       $.ajax({ 
       type: "GET", 
       async: true, 
       url: "/Import/Finish", 
       success: function (data) { 
        ....       
       });            
      } 
      if (n < 2) { 
       $('#details').html($('#details').html() + 'someText')); 
      }           
     } 
    }); 
    } 
} 

for (var i = 0; i < 20; i++) { 
    makeReq(i); 
} 

这个问题可以通过创建一个函数和调用它的每次循环,同时通过我来解决;调用函数将形成一个全新的执行上下文,其中i的值保留并可在该上下文中以任何方式使用。

+0

@Jsi makeReq已输入,但MyMethod未被调用,甚至没有调用。 –