Ngoài các câu trả lời hữu ích khác tại đây, nếu bạn không cần các tính năng bổ sung mà các giải pháp đó cung cấp, thì asynchronous semaphore rất dễ thực hiện.
Đây là khái niệm cấp thấp hơn so với các tùy chọn khác được trình bày ở đây, vì vậy bạn có thể tìm thấy những tiện ích này thuận tiện hơn cho nhu cầu của mình theo số . Tuy nhiên, tôi nghĩ rằng các ẩn dụ không đồng bộ có giá trị biết, ngay cả khi bạn sử dụng các tóm tắt cấp cao hơn trong thực tiễn .
Nó trông giống như sau:
var sem = function(f){
var busy = 0;
return function(amount){
busy += amount;
if(busy === 0){
f();
}
};
};
Và bạn gọi nó như thế này:
var busy = sem(run_me_asap);
busy
là một chức năng duy trì một truy cập nội bộ của hành động không đồng bộ mà nó đang đợi. Khi đó bộ đếm nội bộ bằng không, nó sẽ kích hoạt chức năng run_me_asap
, mà bạn cung cấp.
Bạn có thể tăng bộ đếm nội bộ trước khi chạy một hành động không đồng bộ với busy(1)
và thì hành động không đồng bộ có trách nhiệm decrementing truy cập với busy(-1)
khi nó hoàn tất. Đây là cách chúng tôi có thể tránh sự cần thiết cho bộ hẹn giờ. (Nếu bạn thích, bạn có thể viết sem
để nó trả về một đối tượng với inc
và dec
phương pháp thay vào đó, như trong bài viết Wikipedia; này chỉ là cách tôi làm điều đó.)
Và đó là tất cả các bạn phải làm để tạo ra một không đồng bộ semaphore.
Đây là ví dụ về việc sử dụng. Bạn có thể xác định hàm run_me_asap
như sau.
var funcs = [func1, func2, func3 /*, ...*/];
var run_me_asap = function(){
funcs.forEach(function(func){
func();
});
});
funcs
có thể là danh sách các chức năng mà bạn muốn chạy trong câu hỏi của bạn. (Có lẽ đây không phải là khá những gì bạn muốn, nhưng thấy 'NB' của tôi dưới đây.)
Sau đó ở nơi khác:
var wait_until_ive_finished = function(){
busy(1);
do_something_asynchronously_then_run_callback(function(){
/* ... */
busy(-1);
});
busy(1);
do_something_else_asynchronously(function(){
/* ... */
busy(-1);
});
};
Khi cả hai hoạt động không đồng bộ đã hoàn thành, busy
's truy cập sẽ được thiết lập về 0 và run_me_asap
sẽ là được gọi.
N.B. Cách bạn có thể sử dụng các ẩn dụ không đồng bộ phụ thuộc vào kiến trúc mã của bạn và các yêu cầu của riêng bạn; những gì tôi đã đặt ra có thể không chính xác những gì bạn muốn. Tôi chỉ cần cố gắng cho bạn biết cách hoạt động của chúng; Phần còn lại là tùy thuộc vào bạn!
Và, một lời khuyên: nếu bạn đã sử dụng đồng bộ Cột sau đó tôi muốn khuyên bạn nên che giấu sự sáng tạo của họ và các cuộc gọi đến busy
trừu tượng đằng sau cao cấp nên rằng bạn không xả rác ứng dụng của bạn mã với chi tiết cấp thấp.
Bạn đang sử dụng bất kỳ thư viện nào như jQuery hay Dojo? Chúng có khả năng trì hoãn phù hợp với cách sử dụng của bạn. –
Bạn cần tìm hiểu về các lời hứa. Xem Q, hoặc hoãn lại của jQuery. – djechlin
@karel - vui lòng không chỉnh sửa các câu hỏi như vậy ... – Neal