2013-04-25 34 views
7

Tôi đang gặp khó khăn khi hiểu chính xác cách hoạt động của process.nextTick. Tôi nghĩ tôi đã hiểu, nhưng tôi dường như không thể tái tạo như thế nào tôi cảm thấy điều này nên làm việc:hiểu hàng đợi sự kiện node.js và process.nextTick

var handler = function(req, res) { 
    res.writeHead(200, {'Content-type' : 'text/html'}); 
    foo(function() { 
     console.log("bar"); 
    }); 
    console.log("received"); 
    res.end("Hello, world!"); 
} 

function foo(callback) { 
    var i = 0; 
    while(i<1000000000) i++; 
    process.nextTick(callback); 
} 

require('http').createServer(handler).listen(3000); 

Trong khi foo được vòng lặp, tôi sẽ gửi qua một vài yêu cầu, giả định rằng handler sẽ được xếp hàng nhiều lần đằng sau foo với callback chỉ được nạp khi foo hoàn tất.

Nếu tôi đúng về cách làm việc này, tôi giả sử kết quả sẽ trông như thế này:

received 
received 
received 
received 
bar 
bar 
bar 
bar 

Nhưng nó không, nó chỉ là tuần tự:

received 
bar 
received 
bar 
received 
bar 
received 
bar 

tôi thấy rằng foo đang quay trở lại trước khi thực hiện callback được mong đợi, nhưng có vẻ như callback là TIẾP THEO trong hàng, thay vì ở cuối hàng đợi, đằng sau tất cả yêu cầu sắp tới. Đó có phải là cách hoạt động không? Có lẽ tôi không hiểu chính xác hàng đợi sự kiện trong nút hoạt động như thế nào. Và xin đừng chỉ cho tôi here. Cảm ơn.

Trả lời

2

process.nextTick đặt lại cuộc gọi lại vào lần đánh dấu tiếp theo sẽ được thực hiện, chứ không phải ở cuối hàng đợi đánh dấu.

Tài liệu Node.js (http://nodejs.org/api/process.html#process_process_nexttick_callback) nói: "Nó thường chạy trước khi bất kỳ sự kiện I/O nào khác kích hoạt, nhưng có một số ngoại lệ."

setTimeout (gọi lại, 0) có thể hoạt động giống như bạn mô tả.

+2

Không, 'setTimeout' hoạt động giống như vậy. Tôi đoán tôi thực sự hỏi làm thế nào tôi phải bắt đầu xử lý các yêu cầu http trước khi một yêu cầu trước đó được hoàn thành. – alf

+0

Thực ra, tôi nhận ra rằng 'setTimeout' thực hiện chính xác những gì tôi đang tìm kiếm, vì vậy tôi xin lỗi. Nhưng chính xác thì 'process.nextTick' là gì nếu nó không cho phép xen kẽ các nhiệm vụ chuyên sâu của CPU và xử lý http? – alf

+0

"không phải ở cuối của đánh dấu" - vì vậy, là có một cách để đẩy một chức năng tùy ý ở cuối hàng đợi sự kiện? Phương thức 'setTimeout (fn, 0)' có được đề xuất hay chỉ là giải pháp thay thế? – incarnate

1

Bạn chắc chắn nên đọc fgascon liên kết được cung cấp, và có lẽ

https://github.com/joyent/node/issues/3335 cho nền hơn.

Sử dụng process.nextTìm khi bạn muốn gọi một số mã trước bất kỳ IO nào, nhưng sau khi ngữ cảnh gọi trở lại (thường là vì bạn muốn đăng ký trình nghe trên bộ phát sự kiện và cần trả lại trình phát được tạo trước khi bạn có thể đăng ký bất cứ điều gì).

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