Подтвердить что ты не робот

Предотвратить второй вызов ajax от ожидания до завершения первого вызова ajax

Я запускаю два вызова ajax при загрузке страницы. Они работают как ожидалось, если я открою страницу в настольном браузере.

Однако, если я открою одну и ту же страницу в браузере Android (например, Chrome), я заметил, что вторая функция ajax response ждет завершения первой функции ajax, которая как бы поражает цель асинхронности. Оба выполняются одновременно, но вторая функция success выполняется только после завершения первой функции ajax-вызова success.

Снимок экрана

Ajax Calls

Тот факт, что он работает в настольных браузерах, а не в браузерах для 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
        }
    }); 
      }

});
4b9b3361

Ответ 1

Отметьте этот вопрос SO

Вот ответ, который указывает на Browserscope, который даст вам некоторую информацию о том, сколько одновременных подключений можно сделать в современных браузерах. Одна из целей тестирования, если вы нажмете какой-то лимит, - попытаться разместить две конечные точки в отдельных доменах. Если он работает, вы узнаете, что у браузеров есть ограничение на 1 вызов на домен, хотя из списка браузеров это выглядит так, как будто этого не должно быть.

Я также запускал ваш код локально и не видел того же поведения, которое вы описываете (используя Xcode iPhone simulator iOS7 и мобильный Safari).

Кроме того, у вас есть две установки $(function(){, одна из которых завернута в другую. Может быть, исправить это и посмотреть, если это имеет значение...

Ответ 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();
        }
    })); 

Ответ 3

Этот полный подход может помочь вам

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>

CASE 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() Синхронизация вызовов...

Ответ 4

Я думаю, что это из-за записи сессий в ваших файлах php.

использовать

session_write_close()

после записи в $ _SESSION

надеюсь, поможет вам