2012-01-19 17 views
7

Estoy trabajando en una aplicación web y necesito cargar algunos archivos $ .ajax. Encontré algo interesante en $ .when(). Then().¿Alguien puede explicar claramente cómo funcionan jQuery.when() y deferred.then()?

funciona muy bien cuando no tengo nada especial que ver con los datos devueltos por la solicitud como en este ejemplo:

$.when(
    $.getScript('js/script1.js'), 
    $.getScript('js/script2.js') 
).then(function(){ 
    // Do whatever I want once both scripts are loaded... 
}); 

Si funciona bien cuando tengo una sola petición ajax así:

$.when(
    $.ajax('xml/myxml.xml') 
).then(function(data){ 
    // Here I can work with data like I would with a regular ajax request 
    alert($(data).find('mynode').text()); 
}) 

Pero si trato de la siguiente, no puedo conseguir que funcione:

$.when(
    $.ajax('xml/myxml.xml'), 
    $.getScript('js/script.js') 
).then(function(data){ 
    // But here, I can't access $(data).find('mynode')... 
}) 

leí el deferred object página pero la mayoría era demasiado técnica para mí y no puedo entender cómo se supone que puedo obtener mis datos ajax cuando estoy usando $ .when(). Then() para cargar scripts y datos de múltiples fuentes.

Así que si alguien puede ayudarme a descubrir cómo usar mis datos de ajax en mi caso de prueba anterior, ¡sería genial! Y si, mientras tanto, alguien puede explicar el objeto diferido de una manera más fácil de entender que la documentación oficial de jQuery, ¡sería increíble!

¡Gracias!

+0

Intente inspeccionar los argumentos devueltos por 'diferido.then' en ese caso. 'console.log (arguments)' por favor publique los resultados. –

+0

Mire el ejemplo en esta página: http://api.jquery.com/jQuery.when/ –

+0

Su método 'then' debe aceptar dos argumentos:' .then (función (a1, a2) {'.... 'a1' será el resultado de la primera llamada ajax.' a2' será el resultado de la llamada getcript –

Respuesta

3

Aparentemente, para cada objeto diferido, al menos si se trata de una solicitud de Ajax, $.when pasa un argumento como [ "success", statusText, jqXHR ] a la devolución de llamada. jqXHR es un objeto que representa XMLHttpRequest (más sobre esto en el $.ajax documentation). Por lo que el siguiente debería funcionar:

$.when(
    $.ajax('xml/myxml.xml'), 
    $.getScript('js/script.js') 
).then(function(a){ 
    $(a[2].responseText).find('mynode'); 
}); 

Véase el primer ejemplo en la documentación $.when.

En cuanto a los objetos diferidos en general, quizás this question ayuda.

+0

¿'' done() 'funciona de la misma manera, ya que probablemente ya tenga una demostración para probarlo? Teniendo en cuenta que ya que no está aplicando las devoluciones fallidas, tiene más sentido usar '.done' en lugar de' .then'? –

+0

@KevinB: No lo he probado aún para ser honesto. Listo funcionaría de la misma manera y tiene razón, podría ser mejor agregar diferentes manejadores de errores y de éxito. Aunque no sé cómo se ve el argumento en un caso de falla. Probablemente '[" error ", statusText, jqXHR]', pero no estoy seguro (y tengo tiempo para probarlo ahora mismo). –

+0

Gracias, Félix, tu respuesta me puso en el camino correcto, pero el índice de los datos xml es 0, no 2 ... Si, si hago $ (datos [0]). Find ('mynode') funciona ... – Gabriel

Cuestiones relacionadas