Предотвратить второй вызов 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
}
});
}
});
Ответы
Ответ 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
надеюсь, поможет вам