2011-07-02 13 views
5

Tengo el siguiente código:funciones Cómo hacer jQuery secuenciales

$(document).ready(function() { 
    loadStuff(someURL, someID); 
    showStuff('foo'); 
}); 

showStuff() se basa en el contenido generado por loadStuff(), pero parece como si showStuff() está saltando el arma antes de que dicho contenido se encuentra disponible . ¿Cómo puedo obligarlos a ejecutar secuencialmente?

Actualización: Sí, hay llamadas ajax en loadStuff, pero lamentablemente son jsonp, por lo que no se pueden llamar sincrónicamente.

Respuesta

6

reescribir como:

$(document).ready(function() { 
    loadStuff(someURL, someID, function() { showStuff('foo'); }); 
}); 

donde el tercer parámetro de loadStuff es la devolución de llamada para llamar después de que el contenido se carga

+0

Sí! Exactamente lo que estaba buscando. Gracias un montón. – MizzJop

0

Ellos hacen ejecución secuencial, pero lo que hay dentro loadStuff no son necesariamente (especialmente si está realizando loadStuffasincrónica peticiones HTTP). Es el código dentro deloadStuff que no se ejecuta secuencialmente.

Por lo general, me gustaría simplemente que "necesitamos manera más contexto código para responder a esta pregunta", pero no lo suficiente como para decir esto:

utilizar una petición HTTP sincrónico, o mover la llamada a showStuff en la devolución de llamada en éxito para su sesión asíncrona, de modo que solo se active cuando la solicitud se haya completado.

6

La manera elegante está utilizando jQuery.Deferred, en particular Deferred.pipe. Vea la pregunta Understanding jQuery Deferred.pipe() para un ejemplo.

+0

Sí, definitivamente es una buena forma de hacerlo. http://www.erichynds.com/jquery/using-deferreds-in-jquery/ lo explica muy bien. El único inconveniente es que necesita usar Jquery 1.5 o superior – rajasaur

+0

Advertencia: A partir de jQuery 1.8, el método [deferred.then()] (http://api.jquery.com/deferred.then/) (...) reemplazando el ahora diferido método deferred.pipe() – T30

0

Puede:

Pass showStuff como delegado a una devolución de llamada que se invoca en una respuesta exitosa de su llamada AJAX dentro loadStuff().

Ejemplo:

function loadStuff() { 

     $.ajax({ 
     url: "Stuff/GetStuff", 
     success: function(){ 
     showStuff(); 
     } 
    }); 

} 

O, la forma menos elegante, simplemente comprobar si los datos se cargan de vez en cuando, hasta que es:

var timerId = setInterval(showStuff, 50); 

function showStuff() { 
    if (stuffIsLoadded) { 
    // do show stuff stuffs. 
    clearInterval(timerId); 
    } 
} 
Cuestiones relacionadas