2012-01-19 26 views
7

Bir web uygulamasında çalışıyorum ve birkaç dosya yüklemem gerekiyor $ .ajax. $ .when(). Sonra() içinde ilginç bir şey buldum.Birisi jQuery.when() ve deferred.then() yönteminin nasıl çalıştığını açıklayabilir mi?

Ben bu örnekte olduğu gibi isteği tarafından döndürülen verilerle yapmak için özel bir şey olmadığı zamanlarda Harika çalışır:

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

Eğer işler iyi böyle tek ajax isteği olduğunda:

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

Ama aşağıdakileri deneyin, işe alamıyorum:

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

benokumaksayfa ama çoğu benim için çok teknikti ve ben komut dosyaları ve veri yüklemek için $ .when(). Sonra() kullanırken ajax verilerimi alamadım nasıl anlayamıyorum anlayamıyorum çoklu kaynaklar.

Eğer birisi yukarıda benim test durumumda ajax verilerinin nasıl kullanıldığını öğrenmeme yardımcı olabilirse, bu harika olurdu! Ve eğer bu arada birisi ertelenmiş nesne şeylerini resmi jQuery belgelerinden daha kolay anlayabilecek bir şekilde açıklayabilirse, bu harika olurdu!

Teşekkür ederiz!

+0

Bu durumda 'deferred.then' tarafından döndürülen argümanları incelemeyi deneyin. 'console.log (argümanlar)' lütfen sonuçları yazınız. –

+0

Bu sayfadaki örneğe bakın: http://api.jquery.com/jQuery.when/ –

+0

Sizin 'o zaman yönteminiz iki argümanı kabul etmelidir:' .then (function (a1, a2) {'.... 'aa' ilk ajax çağrısının sonuçları olacaktır. a2', makbuz çağrısının sonuçları olacaktır –

cevap

3

Görünüşe göre, her ertelenmiş nesne için, en azından bir Ajax isteği ise, $.when geri çağrıya [ "success", statusText, jqXHR ] gibi bir bağımsız değişken iletir. jqXHR, XMLHttpRequest öğesini temsil eden bir nesnedir (daha fazla bilgiyi $.ajax documentation). Yani şu çalışmalıdır:

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

$.when belgelerinde ilk örneğe bakın.

Genel olarak ertelenmiş nesneler hakkında, belki de this question yardımcı olur.

+0

'.done()' aynı şekilde çalışıyor, test etmek için bir demo? Başarısız geri aramalar uygulamamanız nedeniyle, '.den' yerine '.done' kullanmak daha mantıklıdır? –

+0

@KevinB: Henüz dürüst olmamak için test etmedim. Bitti aynı şekilde çalışır ve haklısınız, farklı başarı ve hata işleyicileri eklemek daha iyi olabilir. Gerçi argümanın bir başarısızlık durumunda nasıl göründüğünü bilmiyorum. Muhtemelen '[" error ", statusText, jqXHR]', ama emin değilim (ve şimdi test etmek için zamana sahip). –

+0

Teşekkürler Felix, cevabınız beni doğru yola koydu ama xml verisinin indeksi 0 değil, 2 ... Si $ (data [0]) yaparsam bul ('mynode') çalışır ... – Gabriel

İlgili konular