2011-06-05 6 views
8

Estoy escribiendo un pequeño script que hace llamadas AJAX individuales a través de un bucle y me encontré con un problema, muy probablemente obvio. Parece que el ciclo va a ser rápido para manejar los datos que se reciben con ajax, causando que solo cargue la última información en el ciclo. Agregué un cuadro de alerta que recorre las iteraciones y que carga bien los datos, pero no sería práctico en un entorno de usuario. El código es simplemente un jquery .post() con una devolución de llamada dentro de un for-loop. Puedo publicar el código a pedido, pero siento que esto se puede aclarar verbalmente. ¿Alguien sabe una solución alternativa o un mejor enfoque para cargar datos secuencialmente? Gracias.Syncronous JQuery.post()

EDITAR

¿Se .ajaxSetup() modificar .post()? Tal vez pueda usarlo para cambiar el valor asíncrono para .post() ..

+2

ajax, por definición, es asíncrona;) – Jakub

+3

Tal vez usted puede tratar de convertir asíncrono: falsa en sus opciones de llamada Ajax. Al hacer esto, colocará cada solicitud de ajax en una cola hasta que se ejecuten secuencialmente. – sadmicrowave

+0

Le daré una oportunidad –

Respuesta

4

De hecho, me encontrado que la adición de este fragmento funcionó, así que no tengo que cambiar mi .post() para .ajax()

$.ajaxSetup({ async: false });

no estoy seguro de si también va a cambiar la configuración de mis otras llamadas ajax a través de

+0

sólo hay que poner que 'fragmento' en la llamada ajax que está en su bucle, de esa forma no altera la forma en que se ejecutan sus otras llamadas ajax. Publicaré una respuesta que demuestre lo que quiero decir ... – sadmicrowave

+0

No hay razón para que no pueda enviar solicitudes asincrónicas en un bucle. Sospecho que tienes algún tipo de problema de contexto para que todas las funciones de éxito estén actualizando el mismo elemento o algo así. Si publica su código, probablemente le daría una mejor idea. El envío de solicitudes sincrónicas en un bucle suspenderá el navegador hasta que se completen todas las solicitudes. –

+0

@kingjiv Eso es exactamente correcto. La función de éxito llena una tabla. –

5

Es necesario forzar su llamada AJAX para ser sincrónica mi amigo;)

http://api.jquery.com/jQuery.ajax/

ejemplo:

asyncBoolean por defecto: true

por defecto, todas las peticiones se envían de forma asíncrona (es decir, este se establece en true por defaul t). Si necesita solicitudes sincrónicas, establezca esta opción en falso. Solicitudes entre dominios y tipo de datos: las solicitudes "jsonp" no son compatibles con la operación síncrona. Tenga en cuenta que las solicitudes sincrónicas pueden bloquear temporalmente el navegador, deshabilitando cualquier acción mientras la solicitud está activa.

0

Si usa async: false debería poder poner cada una de sus llamadas ajax en una cola hasta que se ejecuten en un método síncrono. De este modo:

for(var i=0;i < x;i++){ 
    $.ajax({url: 'myurl', 
      async: false, 
      success: function(data){ 
         //do something with the returned 'data' 
         }; 
    }); 
} 
0
function myFunction() { 
    var x; 
for(var i=0;i<10;i++){ 
    if (confirm("Press a button!") == true) { 
     x = "You pressed OK!"; 
    } else { 
     x = "You pressed Cancel!"; 
    } 
    document.getElementById("demo").innerHTML = x; 
} 
} 

    enter code here 
Cuestiones relacionadas