防止第二个ajax调用等待第一个ajax调用完成

时间:2013-12-13 13:41:09

标签: android jquery ajax

我在页面加载时运行了两个ajax调用。如果我在桌面浏览器中打开页面,它们都会按预期工作。

但是,如果我在Android浏览器(例如Chrome)中打开同一页面,我注意到第二个ajax函数的响应正在等待第一个ajax函数的完成,这有点挫败了目的异步的。两者都是并发执行,但第二个函数的success仅在完成第一个ajax调用的success函数后执行。

截图

Ajax Calls

它在桌面浏览器中而不是在Android浏览器中工作这一事实使我相信在android中必须有某种设置阻止并发异步调用。

如果是这种情况,我可以禁用它吗?我的代码如下btw:

$(function(){           
       var intervalID = window.setInterval(function(){
                doAjax(); // this is the function which is waiting for completion of first ajax call
            }, 2000);

      // the first ajax call
      $.ajax({
    type:'post',
    url:'progress-insert.php', // basically is meant for insertion of records into db
    success:function(data)
    {
       clearInterval(intervalID);
    }   
     });

     function doAjax()
     {          
    $.ajax({
        type:'post',
        url:'progress-update.php', // basically returns how many records have been inserted so far
        success:function(data)
        {
                // do something
        }
    }); 
      }

});

4 个答案:

答案 0 :(得分:2)

查看this SO question

有一个答案指向Browserscope,它将为您提供有关在现代浏览器中可以进行多少同时连接的信息。测试您是否达到某种限制的一个想法是尝试在不同的域上托管两个端点。如果它工作,那么你就会知道浏览器每个域的限制为1次,尽管从Browserscope列表中看起来似乎并非如此。

我也在本地运行你的代码并没有看到你所描述的相同行为(使用Xcode iPhone模拟器iOS7和移动版Safari)。

此外,您似乎有两个$(function(){设置,一个包裹在另一个中。也许解决这个问题,看看它是否有所作为......

答案 1 :(得分:2)

不幸的是,javascript的所有浏览器实现都是单线程的,这意味着异步调用对于服务器是异步的,但对于相同的javascript&因此等待旧请求。你能做些什么来克服这个问题就是在一个变量和一个变量中推送请求。下次检查请求状态是否为200 Ok / Success,不再进一步调用相同的函数,示例代码可以是:

requests.push($.ajax({
        type:'post',
        url:'progress-update.php', // basically returns how many records have been inserted so far
        success:function(data)
        {
              for(var i = 0; i < requests.length; i++)
              requests[i].abort();
        }
    })); 

答案 2 :(得分:1)

这种完整的方法可能对您有所帮助

CASE A ...一次ajax

<script type="text/javascript" >
//Global Variable
$.numx={loaded:false, timerx:0 }


// Document Ready
jQuery(function ($) {

    // button click to insert
    $("#button_click").on("click", function(){
         //Ajax call Insert...myabe help you the insert returns some in json
         $.getJSON( 'progress-insert.php', function(json) { 
              //the waiting function for insert is ready 
              $.numx.timerx=setInterval("waiting_insert()",50);
              if(json!=null){
                   // set to the global variable the insert is ready..and pass to continue 
                   $.numx.loaded=true;
                   // paste another actions to perform... 
               }
          });

    });

});



function waiting_insert(){
    if( $.numx.loaded==true){ 
                // tell to the waiting no more waiting
        clearInterval($.numx.timerx);
              // HERE perform the second ajax progress_update.php
        }
}
</script>

案例B - 很多时间的AJAX 基本上 删除setinterval和clearInterval并执行许多ajax调用 在同一个功能...... 像这样

<script type="text/javascript" >
// window load .. is charged in event load of page
$(window).load(function(){

     // two ajax calls at the same time

     $.ajax({
    type:'post',
    url:'progress-insert.php',
    success:function(data)
    {
       //do something
    }  
   });


    $.ajax({
        type:'post',
        url:'progress-update.php', // basically returns how many records have been inserted so far
        success:function(data)
        {
                // do something
        }
   });
});
</script>

请仔细检查您的Jquery版本 从jQuery 1.8开始,不推荐使用async:false 在以前的版本async false中,可能已经在全局中像$ .ajaxSetup()的一部分一样 拨打电话同步...

答案 3 :(得分:0)

我认为这是因为在您的php文件中编写了会话。

使用

  

session_write_close()

写入$ _SESSION后

希望可以帮助您。