2016-04-05 20 views
8

Tôi có đoạn mã sau:số kết quả đầu ra Tại sao setTimeout không theo thứ tự thêm

function wait(ms) { 
    var start = +(new Date()); 
    while (new Date() - start < ms); 
} 

(function() { 
    setTimeout(function(){console.log(2)}, 1000); 
    setTimeout(function(){console.log(3)}, 0); 
    setTimeout(function(){console.log(4)}, 0); 
    wait(2000); //!!! blocking events processing here 
})(); 

Nó ra:

3 
4 
2 

Tôi đã đọc ở đâu đó rằng setTimeout thêm chức năng cho event queue, và sau đó khi hàm này là hàm đầu tiên trong chuỗi nó kiểm tra xem lượng thời gian đã chỉ định có trôi qua hay không, nếu không, nó trì hoãn việc thực hiện. Theo logic này, tôi mong đợi mã trên xuất ra: 2,3,4 kể từ wait() xử lý chuỗi sự kiện và ngăn xếp cuộc gọi hoàn thành và cuối cùng trình duyệt có thời gian để xử lý các hàm được thêm thông qua setTimeout, tất cả ba hàm được đặt trong hàng đợi theo thứ tự được thêm vào và 1000 đã được thông qua cho chức năng đầu tiên, do đó, một trình duyệt có thể lấy nó và thực hiện, nhưng nó chờ đợi cho các chức năng được thêm vào thứ hai và thứ ba. Tại sao? Đâu là lỗi trong logic của tôi?

+4

Điều duy nhất 'đảm bảo setTimeout' là callbacks sẽ được thực thi * như ít nhất là nhiêu mili giây trong tương lai * theo yêu cầu. Không ai nói gì về việc bảo đảm một thứ tự cụ thể. – deceze

Trả lời

9

Hàm gọi lại nhập vào hàng đợi sau khoảng thời gian chờ. Vì vậy,

setTimeout(function(){console.log(3)}, 0); 
setTimeout(function(){console.log(4)}, 0); 

vào ngay lập tức, nhưng

setTimeout(function(){console.log(2)}, 1000); 

đi vào hàng đợi sau 1 giây. Do đó trình tự 3,4,2

Từ MDN:

Calling setTimeout sẽ bổ sung thêm một thông điệp tới hàng đợi sau thời gian trôi qua như là đối số thứ hai. Nếu không có tin nhắn nào khác trong hàng đợi, tin nhắn được xử lý ngay lập tức; tuy nhiên, nếu có tin nhắn, thông báo setTimeout sẽ phải chờ các tin nhắn khác được xử lý. Vì lý do đó, đối số thứ hai cho biết thời gian tối thiểu và không phải là thời gian được đảm bảo.

(tôi nhấn mạnh)

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