2012-01-19 8 views
7

Sto lavorando a un'applicazione web e ho bisogno di caricare alcuni file $ .ajax. Ho trovato qualcosa di interessante in $ .when(). Then().Qualcuno può spiegare chiaramente come funziona jQuery.when() e deferred.then()?

Funziona benissimo quando non ho nulla di speciale a che fare con i dati restituiti dalla richiesta come in questo esempio:

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

Se funziona bene quando ho una singola richiesta Ajax in questo modo:

$.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()); 
}) 

Ma se provo quanto segue, non riesco a farlo funzionare:

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

ho letto il 0.123.pagina ma la maggior parte di esso era troppo tecnico per me e non sono in grado di capire come dovrei essere in grado di ottenere i miei dati Ajax quando sto usando $ .when(). Then() per caricare script e dati da più fonti.

Quindi, se qualcuno può aiutarmi a scoprire come utilizzare i miei dati Ajax nel mio test case sopra, sarebbe fantastico! E se nel frattempo qualcuno può spiegare la cosa oggetto differito in un modo che è più facile da capire rispetto alla documentazione ufficiale di jQuery, sarebbe fantastico!

Grazie!

+0

Provare a controllare gli argomenti restituiti da 'deferred.then' in quel caso. 'console.log (argomenti)' per favore pubblica i risultati. –

+0

Guarda l'esempio in questa pagina: http://api.jquery.com/jQuery.when/ –

+0

Il tuo metodo 'then' dovrebbe accettare due argomenti:' .then (function (a1, a2) {'.... 'a1' sarà il risultato della prima chiamata ajax.' a2' sarà il risultato della chiamata Getcript –

risposta

3

Apparentemente, per ogni oggetto posticipato, almeno se si tratta di una richiesta Ajax, $.when passa un argomento come [ "success", statusText, jqXHR ] alla richiamata. jqXHR è un oggetto che rappresenta XMLHttpRequest (maggiori informazioni su $.ajax documentation). Così il seguente dovrebbe funzionare:

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

Vedere il primo esempio nella documentazione $.when.

Per quanto riguarda gli oggetti posticipati in generale, può essere utile il this question.

+0

'.done()' funziona allo stesso modo, poiché probabilmente hai già una dimostrazione fino a provarlo? Considerato che dal momento che non si applicano anche callback di fail, è più logico utilizzare '.done' piuttosto che' .then'? –

+0

@ KevinB: Non l'ho ancora testato per essere onesto. Fatto funzionerebbe allo stesso modo e hai ragione, potrebbe essere meglio aggiungere diversi gestori di successo ed errori. Anche se non so come l'argomento appare in un caso di fallimento. Probabilmente '[" errore ", statusText, jqXHR]', ma non lo so per certo (e ho il tempo di testarlo adesso). –

+0

Grazie Felix, la tua risposta mi ha messo sulla strada giusta ma l'indice dei dati xml è 0, non 2 ... Si se faccio $ (dati [0]). Find ('mynode') funziona ... – Gabriel

Problemi correlati