2013-01-13 31 views
6

Tôi đang tìm một loại Thread.Join(). Cho phép nói rằng tôi kích hoạt 4 sự kiện trong javascript. Tôi muốn thực thi mã nhưng chỉ sau khi tất cả 4 cuộc gọi lại đã được hoàn thành. Làm thế nào để làm điều đó? Cách duy nhất tôi có thể nghĩ đến là kiểm tra nếu có 4 callbacks đang trong quá trình thông qua var toàn cầu trong trường hợp tôi bỏ qua hoặc ném ngoại lệ. Nhưng nếu không làm một cái gì đó như globalVar ++ trong mỗi cuộc gọi lại và gọi IsItDone() ở cuối mỗi cuộc gọi lại để kiểm tra xem globalVar có phải là == 4.Tham gia nhiều cuộc gọi lại/chuỗi trong javascript?

Nhưng .. Tôi không thích nó đặc biệt vì tôi cần sử dụng var toàn cầu.

+0

Đưa một cái nhìn tại pubsub.js nó thực sự hữu ích cho việc kết nối các sự kiện với nhau. Đăng ký và xuất bản chỉ đồng bộ hóa qua từng sự kiện được đăng ký theo thứ tự (nếu bạn gắn cờ nó là đồng bộ hóa). https://github.com/mroderick/PubSubJS – Gats

+0

Đã thêm rằng làm nhận xét vì đó không phải là câu trả lời trực tiếp. – Gats

Trả lời

3

Nếu bạn không ngại thêm jQuery vào trang web của mình, bạn có thể sử dụng khả năng "deferred object" của nó.

Mỗi chức năng không đồng bộ (bao gồm các hàm AJAX được tích hợp sẵn của jQuery) có thể trả về "lời hứa" để trả về một cái gì đó sau này.

Để đạt được những gì bạn đang yêu cầu cho bạn sau đó có thể gọi:

$.when(p1, p2, p3, p4).done(function() { 
    // this will be called only when 
    // all of p1 - p4 have been "resolved" 
}); 

Nếu bạn muốn có một mảng p chứa những lời hứa thay vào đó, gọi $.when như thế này thay vì:

$.when.apply($, p).done(function() { 
    ... 
}); 
+0

Tôi nghĩ tôi sẽ sử dụng –

7

Bạn có thể xâu chuỗi hàng đợi và tự động gọi lại, nhưng nó lại có nhiều lông. May mắn là có rất nhiều thư viện để giúp bạn. Tôi không phải là người hâm mộ của phương pháp phản đối vì đôi khi rất khó để biết gọi lại chưa được kích hoạt.

Tôi là người hâm mộ của phong cách "Trì hoãn". Chẳng hạn như thư viện này: https://github.com/heavylifters/deferred-js

Hoặc cho một API hoàn toàn khác nhau, xem Step.js https://github.com/creationix/step

Hoặc xem ở đây để libs vi khác mà gói gọn vấn đề này: http://microjs.com/#defer


Hoặc chỉ cần làm điều đó chính bạn bằng cách gọi thiết lập một số trạng thái bên ngoài, và sau đó gọi một hàm chia sẻ done trong mọi cuộc gọi lại.

var complete = { 
    first: false, 
    second: false 
}; 

doFirstAsync(function() { 
    complete.first = true; 
    allDone(); 
}); 

doSecondAsync(function() { 
    complete.second = true; 
    allDone(); 
}); 

var allDone = function() { 
    if (complete.first && complete.second) { 
    alert("done with all async!"); 
    } 
}; 

Hầu hết các thư viện ở trên đều làm việc này cho bạn dựa trên phương pháp tương tự. Nhưng chỉ trừu tượng và khái quát hóa. Sự khái quát hóa đó là nơi mọi thứ có thể có lông, vì bạn có các mảng hàm callbacks bay khắp mọi nơi. Đó là chương trình chức năng thú vị, nhưng nó có thể phức tạp về khái niệm.

Nếu bạn đang thực hiện việc này, hãy sử dụng lib có API bạn thích.