2012-12-12 22 views
6

Về cơ bản tôi Tring viết này:

var async1 = $.when(a1()).then(function(){ a2() }); 
var async2 = $.when(a3()).then(function(){ a4() }); 

$.when(async1, async2).then(function(){ 
    console.log("complete"); 
}); 

Nhưng tại thời điểm khi a1 và a3 đã thực hiện các chức năng xem xét bản thân giải quyết.

tôi cùng nhau đưa các ví dụ tương tự trong một fiddle: http://jsfiddle.net/Z7fzR/

+0

Khi nào bạn * mong đợi * họ được giải quyết? –

+0

@ExplosionPills khi a1, a2 a3 và a4 đều được giải quyết, tôi sẽ mong đợi cuối cùng khi được giải quyết. Nếu bạn làm theo? – JonWells

+0

Chỉ cần đoán ... Điều gì sẽ xảy ra nếu bạn thay đổi nó thành điều này? '$ .when (a1(). sau đó (function() {a2()})); ' –

Trả lời

10

Bạn không bao giờ thực sự trở lại các đối tượng hứa hẹn tạo ra bởi a2()a4() từ callback; này một cách hiệu quả trả về null, mà dường như tính như là một kết thúc cho $.when mục đích:

http://jsfiddle.net/Z7fzR/1/

4

Bạn đang ném đi lời hứa đối tượng mà a2a4 trở lại, về cơ bản đi qua undefined trở lại với bản gốc when, mà làm cho nó giải quyết ngay lập tức:

Nếu một đối số được chuyển đến jQuery.when và nó không phải là trì hoãn, nó sẽ được coi là Trì hoãn đã giải quyết và mọi việc được thực hiệnCallbacks đính kèm sẽ được thực hiện ngay lập tức.

Thêm một số lợi nhuận và hoạt động tốt.

var async1 = $.when(a1()).then(function(){ return a2(); }); 
var async2 = $.when(a3()).then(function(){ return a4(); }); 

$.when(async1, async2).then(function(){ 
    console.log("complete"); 
}); 

http://jsfiddle.net/Z7fzR/2/