2013-04-03 45 views
0

一段时间后,这是我的代码:浏览器停止工作在同步Ajax调用for循环

for (var i = 0; i < 2; 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')); 
      }           
     } 
    }); 
} 

在这个例子中迭代虽小,但我做了这里的方法更简单。我知道我可以使用开关,但那不是重点。实际上它有更多的循环。没关系,这个错误也发生在这个代码上。

下面是发生了什么: 如果我把断点放入第一个ajax调用的成功部分,并且在Chrome中调试时,eveything可以正常工作。 下面是我的意思是工作得很好:在方法进入第一次成功之后,我想隐藏一些div并显示ajax调用的结果。第二次输入第一个成功时,另一个字符串将被添加到前一个。 最后,当输入第二个成功部分时,该消息将被隐藏,并显示一些数据。

这就是发生了什么事情: 一切都很好,直到MyMethod被调用。当它被调用时,浏览器停止工作。如果我按下鼠标左键,则什么都不会发生。当最后一次调用MyMethod时,浏览器工作正常,我可以快速浏览消息,然后显示第二个Ajax调用的数据。而且我很快看到的消息是从MyMethod的所有调用中发出的全部消息,这不应该发生。

我希望它能显示整个for循环和Finish方法之前。它不应该是相同的信息。每次调用MyMethod的Ajax应该会变得更大。

+0

您为什么首先使用同步呼叫? – Chad

+0

你期望浏览器如何处理循环中的同步ajax调用?与alert相同,为了继续脚本执行,浏览器必须先等待ajax调用完成。 – Corneliu

+0

@Chad因为ajax调用处于for循环。 –

回答

2

您可以使用“递归”函数来帮助您使用异步调用来控制流。与其同步运行它们,您可以异步运行它们,然后在下一个时间再次调用该函数。

喜欢的东西:

function doCall(i) { 
    if(i > howManyToRun) return; 

    $.ajax({ 
     //... 
     succcess: function(data) { 
      //... 
      //time to start the next one 
      doCall(++i); 
     }, 
     error: function() { 
      //call the next one on error? 
      doCallI(++i); 
     } 
    }) 
} 

这样,他们异步运行,而他们都呼吁不要阻止一切;但仍然连续运行。