2012-01-19 26 views
7

Tôi đang làm việc trên một ứng dụng web và tôi cần tải một vài tệp $ .ajax. Tôi tìm thấy một cái gì đó thú vị trong $ .when(). Sau đó().Ai đó có thể giải thích rõ ràng jQuery.when() và deferred.then() hoạt động như thế nào?

Nó hoạt động tuyệt vời khi tôi không có bất cứ điều gì đặc biệt để làm với các dữ liệu trả về bởi các yêu cầu như ví dụ sau:

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

Nếu hoạt động tốt khi tôi có một yêu cầu ajax đơn như thế này:

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

Nhưng nếu tôi cố gắng những điều sau đây, tôi không thể có được nó để làm việc:

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

tôi đọc 0.123.trang nhưng phần lớn quá kỹ thuật đối với tôi và tôi không thể hiểu được làm cách nào để có thể lấy dữ liệu ajax khi tôi sử dụng $ .when(). Then() để tải tập lệnh và dữ liệu từ nhiều nguồn.

Vì vậy, nếu ai đó có thể giúp tôi tìm hiểu cách sử dụng dữ liệu ajax của tôi trong trường hợp thử nghiệm ở trên, điều đó thật tuyệt! Và nếu trong khi đó ai đó có thể giải thích điều đối tượng trì hoãn theo cách dễ hiểu hơn tài liệu chính thức của jQuery, nó sẽ rất tuyệt vời!

Cảm ơn bạn!

+0

Hãy thử kiểm tra các đối số được trả về bởi 'deferred.then' trong trường hợp đó. 'console.log (đối số)' vui lòng đăng kết quả. –

+0

Xem ví dụ trên trang này: http://api.jquery.com/jQuery.when/ –

+0

Phương thức 'then' của bạn nên chấp nhận hai đối số:' .then (hàm (a1, a2) {'.... 'a1' sẽ là kết quả của cuộc gọi ajax đầu tiên. 'a2' sẽ là kết quả của cuộc gọi getcript –

Trả lời

3

Dường như, đối với từng đối tượng trì hoãn, ít nhất nếu nó là một yêu cầu Ajax, $.when chuyển đối số như [ "success", statusText, jqXHR ] đến cuộc gọi lại. jqXHR là một đối tượng đại diện cho XMLHttpRequest (nhiều hơn về nó trong $.ajax documentation). Vì vậy, những điều sau đây sẽ hoạt động:

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

Xem ví dụ đầu tiên trong tài liệu $.when.

Về các đối tượng trì hoãn nói chung, có thể this question sẽ giúp.

+0

Có '.done()' hoạt động theo cùng một cách, vì bạn có thể đã có một bản demo để kiểm tra nó? Xem xét rằng vì bạn cũng không áp dụng các callback thất bại, nên sử dụng '.done' hơn là' .then'? –

+0

@KevinB: Tôi chưa thử nghiệm nó thành thật. Xong sẽ làm việc theo cùng một cách và bạn là đúng, nó có thể là tốt hơn để thêm thành công khác nhau và xử lý lỗi. Mặc dù tôi không biết làm thế nào các đối số trông trong một trường hợp thất bại. Có lẽ '[" lỗi ", statusText, jqXHR]', nhưng tôi không biết chắc chắn (và có thời gian để kiểm tra nó ngay bây giờ). –

+0

Cảm ơn Felix, câu trả lời của bạn đã đưa tôi đi đúng hướng nhưng chỉ số dữ liệu xml là 0, không phải 2 ... Si nếu tôi làm $ (dữ liệu [0]). Find ('mynode') nó hoạt động ... – Gabriel

Các vấn đề liên quan