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?
Đ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