android - trigger - tag manager form submit event
Evitar que la segunda llamada ajax espere hasta que se complete la primera llamada ajax (3)
Desafortunadamente, la implementación de javascript en todos los navegadores es de un solo hilo, lo que significa que las llamadas asíncronas son asíncronas para los servidores, pero no para el mismo javascript y, por lo tanto, esperan la solicitud anterior. Lo que puede hacer para superar eso es enviar solicitudes en una variable y la próxima vez que verifique si el estado de la solicitud no es 200 Ok / Success, no haga ninguna otra llamada para la misma función, el código de muestra puede ser como:
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();
}
}));
Estoy ejecutando dos llamadas ajax en la carga de la página. Ambos funcionan como se espera si abro la página en el navegador de escritorio.
Sin embargo, si abro la misma página en un navegador de Android (Chrome, por ejemplo), me di cuenta de que la respuesta de la segunda función ajax está a la espera de que se complete la primera función ajax, lo que en cierto modo anula el propósito de la asincronía. Ambos se ejecutan simultáneamente, pero el success
la segunda función solo se ejecuta después de completar la función de success
de la primera llamada ajax.
Captura de pantalla
El hecho de que esté funcionando en los navegadores de escritorio y no en los de Android me hace creer que debe haber algún tipo de configuración en Android que esté bloqueando las llamadas asíncronas concurrentes.
Si ese es el caso, ¿es posible que pueda desactivarlo? Mi código es el siguiente por cierto:
$(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
}
});
}
});
Echa un vistazo a esta pregunta SO
Hay una respuesta que apunta a Browserscope que le dará información sobre cuántas conexiones simultáneas se pueden hacer en los navegadores modernos. Una idea para probar si está alcanzando algún tipo de límite sería intentar alojar los dos puntos finales en dominios separados. Si funciona, sabrá que los navegadores tienen un límite de 1 llamada por dominio, aunque en la lista de Browserscope parece que ese no debería ser el caso.
También ejecuté tu código localmente y no vi el mismo comportamiento que estás describiendo (usando el simulador de iPhone Xcode iOS7 y Safari móvil).
Además, parece que tienes dos configuraciones $(function(){
, una envuelta en la otra. Tal vez arregla eso y ve si hay una diferencia ...
Este enfoque completo tal vez te ayude
CASO A ... un ajax a la vez
<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>
CASO B: MUCHOS AJAX EN EL TIEMPO Básicamente, elimine setinterval y clearInterval y execute tiene muchas llamadas ajax como quiera en la misma función ... así
<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>
Además, verifique su versión de Jquery A partir de jQuery 1.8, el uso de async: false está en desuso en la versión anterior async false, tal vez se haya configurado en forma global como parte de $ .ajaxSetup () que sincroniza las llamadas ...