2012-12-23 34 views
5

Tôi đã cố gắng hiểu cách hoạt động của Mike Bostock's queue.js, nhưng tôi không thể xem cách hoạt động của nó. Phần tôi không hiểu là cách mã quản lý để tiếp tục thực hiện các cuộc gọi lại. Đặc biệt, tôi không chắc về phương thức pop() (dòng 45). Từ sự hiểu biết của tôi, phương thức này có hàm chưa được xử lý, chưa được xử lý tiếp theo; nối thêm một cuộc gọi lại (có khả năng) bắt đầu hàm hoãn lại tiếp theo trong hàng đợi và thực thi khi hàm popped ngay lập tức kết thúc; sau đó cuối cùng thực hiện chức năng nói. Câu hỏi của tôi là: mã nào thực hiện gọi lại này?Hàng đợi.js hoạt động như thế nào?

+1

Đó là một số mã rất kém nhận xét. –

+1

@LightnessRacesinOrbit: Đó là một mã rất ngắn và súc tích. Tên biến là mô tả và chức năng của chúng được nhận xét. Tôi không thấy lý do nào để bình luận quá mức ... – Bergi

+0

@ Bergi: Tôi chỉ yêu cầu, như, một hoặc hai. Mô tả về chức năng của từng chức năng. Câu hỏi của OP thể hiện sự cần thiết. –

Trả lời

10

Mỗi hàm hoãn lại không thực sự trả về bất kỳ thứ gì - chúng được dự kiến ​​thực thi đối số cuối cùng của chúng dưới dạng gọi lại. Ví dụ, điều này sẽ không làm việc

var foo = function(i) { 
    console.log(i); 
    return i; 
} 
var finished = function(error, results) { 
    console.log(results); 
} 

queue(2) 
    .defer(foo, 1) 
    .defer(foo, 2) 
    .defer(foo, 3) 
    .defer(foo, 4) 
    .awaitAll(finished); // only prints "1" and "2", since foo() doesn't execute callbacks 

Tuy nhiên, nếu chúng ta sửa đổi foo để có một callback,

var foo = function(i, callback) { 
    console.log(i); 
    callback(null, i); // first argument is error reason, second is result 
} 

Sau đó, nó sẽ, như thực hiện các cuộc gọi lại gây queue để tiếp tục.

+0

Ví dụ điển hình, thực sự đã giúp tôi – megatron77

2

Nếu tôi hiểu mã chính xác, queue.await()queue.awaitall() đặt gọi lại trong biến ví dụ await và sau đó điều này được thực hiện bởi notify().

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