Retrasar el bucle while en la función de éxito de AJAX

hola chicos tengo el siguiente codigo

$.ajax({
url: "http://localhost/twee/chat/getnumcom",
type: 'POST',
data: form_data,
success: function(html) {
            var data = parseInt(html);
                page = 20 * data ;

                while ( counter < page ) {

                       $.get("http://localhost/twee/chat/"+id+"/"+counter,function(data){
                       $('#c').append($(data).find('#c').html());
                       });      
                  counter = counter + 20 ;
               } 
          }
});

alert($('#600').length);
$.scrollTo('#600');

Esto es lo que hace. Originalmente, agrega datos a mi ventana hasta que se encuentra el #600. Técnicamente, tengo una función que calcula matemáticamente dónde debería estar 600. Esto está bien y el div está bien cargado.

Sin embargo, agregué la alerta específicamente para verificar si el div está cargado. Un valor de 0 significa que no y un valor de 1 significa que sí. En mi consola Firebug, cuando se activa la función, el ciclo while todavía se está ejecutando, pero la alerta ya muestra un valor de 0. En consecuencia, el desplazamiento no se realiza.

Si vuelvo a activar la función inmediatamente después de ejecutarla, obtengo un 1, lo que significa que se cargó el div.

¿Hay alguna forma de retrasar la función de desplazamiento hasta que se haya ejecutado el bucle while? Siempre pensé que el código se ejecutaría de manera procesal y que la alerta se mostraría después de que se hayan cargado todos los datos.

Supongo que un temporizador sería una opción, pero no quiero usarlo. No estoy muy seguro de cuántos milisegundos debo configurar el temporizador.

preguntado el 12 de junio de 12 a las 20:06

El diseño del código pide ayuda... (no solo porque la variable int se llama html) -

@gdoron el html var es el texto de respuesta xhr, si OP está generando un valor entero solo desde esa llamada, puede muy bien parseInt eso. -

1 Respuestas

Las llamadas Ajax son asincrónicas, ponga su scrollTo/alert dentro de success función de devolución de llamada, después de la while bucle:

$.ajax({
    url: "http://localhost/twee/chat/getnumcom",
    type: 'POST',
    data: form_data,
    success: function (html) {
        var data = parseInt(html);
        page = 20 * data;

        while (counter < page) {
            $.get("http://localhost/twee/chat/" + id + "/" + counter, function (data) {
                $('#c').append($(data).find('#c').html());
                if ($('#600').length)   //if there's a #600 element inside this $.get callback
                    $.scrollTo('#600'); //scrolls to it
            });
            counter = counter + 20;
        }
    }
});

Tenga en cuenta que los ID numéricos solo son válidos en HTML5, si eso le preocupa.

Respondido el 12 de junio de 12 a las 21:06

Todavía 0. Entiendo que las llamadas son asíncronas y técnicamente debería funcionar bien incluso si no está en la devolución de llamada exitosa: Dpkg Me

No hay nada mas. Eso es. No entiendo por qué no funciona también. - Dpkg Me

@DpkgMe que mal, no me di cuenta de que tenías varias llamadas de Ajax con $.get dentro de su devolución de llamada ajax. Intente otra vez ahora, si eso funciona, haré una versión más adecuada. - fabricio matte

@DpkgMe Eliminé la alerta e hice una versión definitiva. =] - fabricio matte

No, esto no funcionará en absoluto. Lo intenté y entra en un bucle infinito y también lo esperaba. Creo que $.scrollTo debería estar fuera de la llamada de éxito. Realmente no importa - Dpkg Me

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.