Retrasar el bucle while en la función de éxito de AJAX
Frecuentes
Visto 877 veces
0
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.
1 Respuestas
1
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 javascript jquery or haz tu propia pregunta.
El diseño del código pide ayuda... (no solo porque la variable int se llama
html
) - gdoron is supporting Monica@gdoron el
html
var es el texto de respuesta xhr, si OP está generando un valor entero solo desde esa llamada, puede muy bienparseInt
eso. - Fabrício Matté