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

Android 防止第二个ajax调用等待第一个ajax调用完成,android,jquery,ajax,Android,Jquery,Ajax,我正在页面加载上运行两个ajax调用。如果我在桌面浏览器中打开页面,它们都能正常工作 但是,如果我在android浏览器(例如Chrome)中打开同一个页面,我注意到第二个ajax函数的响应正在等待第一个ajax函数的完成,这有点违背了异步性的目的。两者都同时执行,但第二个函数的success仅在第一个ajax调用的success函数完成后执行 截图 它在桌面浏览器中工作,而不是在android浏览器中工作,这一事实让我相信android中一定存在某种阻止并发异步调用的设置 如果是这样的话,我

我正在页面加载上运行两个ajax调用。如果我在桌面浏览器中打开页面,它们都能正常工作

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

截图

它在桌面浏览器中工作,而不是在android浏览器中工作,这一事实让我相信android中一定存在某种阻止并发异步调用的设置

如果是这样的话,我可以禁用它吗?我的代码如下:

$(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
        }
    }); 
      }
     
});
退房

有一个答案指出,这将给你一些信息,多少同时连接可以在现代浏览器。测试是否达到某种限制的一个方法是尝试将两个端点托管在不同的域上。如果它能工作,那么您就会知道浏览器对每个域的调用限制为1次,尽管从Browserscope列表来看,情况似乎不应该如此

我也在本地运行了您的代码,但没有看到与您描述的相同的行为(使用Xcode iPhone模拟器iOS7和mobile Safari)


另外,您似乎有两个
$(function(){
设置,一个封装在另一个中。也许可以修复它,看看它是否有区别…

不幸的是,所有浏览器的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();
        }
    })); 
requests.push($.ajax)({
类型:'post',
url:'progress-update.php',//基本上返回到目前为止插入的记录数
成功:功能(数据)
{
对于(var i=0;i
这个完整的方法可能会对您有所帮助

案例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>

//全局变量
$.numx={loaded:false,timerx:0}
//文件准备就绪
jQuery(函数($){
//按钮单击以插入
$(“#按钮_单击”)。在(“单击”,函数(){
//Ajax调用Insert…myabe帮助您插入返回一些json格式的内容
$.getJSON('progress insert.php',函数(json){
//插入的等待函数已就绪
$.numx.timerx=setInterval(“waiting_insert()”,50);
if(json!=null){
//设置为全局变量插入准备就绪..并传递以继续
$.numx.loaded=true;
//粘贴要执行的其他操作。。。
}
});
});
});
函数等待_插入(){
如果($.numx.loaded==true){
//告诉等待的人不要再等待了
clearInterval($.numx.timerx);
//这里执行第二个ajax progress_update.php
}
}
案例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>

//窗口加载..在页面的事件加载中收费
$(窗口)。加载(函数(){
//同时进行两次ajax调用
$.ajax({
类型:'post',
url:'progress-insert.php',
成功:功能(数据)
{
//做点什么
}  
});
$.ajax({
类型:'post',
url:'progress-update.php',//基本上返回到目前为止插入的记录数
成功:功能(数据)
{
//做点什么
}
});
});
另请检查您的Jquery版本 从jQuery1.8开始,不推荐使用async:false 在早期版本async false中,可能已在$.ajaxSetup()的全局类似部分中设置
使调用同步…

我认为这是因为在php文件中编写会话

使用

会话写入关闭()

写入$\u会话后


希望对您有所帮助。

您确定这不会限制您的移动浏览器同时尝试进行的异步连接数量吗?是否有办法确定是否确实如此?“第二个ajax函数正在等待第一个ajax函数的完成”您的意思是第一个ajax调用持续时间超过2秒吗?如果不是,第二个调用只能在第一个调用结束时开始,对吗?因为clearInterval。@TCHdvlp第一个ajax调用大约运行14-16秒(将行插入数据库).同时,我运行第二个ajax函数,查看到目前为止插入了多少条记录,并将其显示在屏幕上。这两个函数在桌面浏览器上同时运行,因此我猜第二个函数不一定要在第一个函数完成后才运行。您可能遇到了ajax请求对于桌面浏览器,它通常是2(图像/css/js/etc将剩余的~6个插槽填充到一个域中)。发生这种情况时,ajax请求只是在浏览器中静默排队,直到有一个打开的插槽,但是js会将其视为已经在运行(因此控制台中的输出)。如果这是一个问题,那么这是一个浏览器限制,除非您以不同的方式检索数据,否则无法克服。我认为该代码可以在模拟器上运行。此外,我在上面发布的代码中没有看到两个
$(functions(){
函数……或者我可能无法发现它