[nodeJs] setTimeout, setImmediate và process.nextTick
nodejs
72
Javascript
246
White

Hoàng Duy viết ngày 21/05/2016

Ba cái phương thức này có vẻ giống giống nhau. Bài này lí giải sự khác nhau của 3 đứa chúng nó.

An event loop refresh

Giả sử rằng bạn đã hiểu về Javascript event loop. Giả sử chưa, thì ở đây tôi tóm tắt lại qua một hình ảnh. Hoặc bạn có thể ngồi đọc ở đây

  • Stack là nơi lưu giữ các con trỏ hàm đang thực hiện,. Khi hàm bắt đầu chạy thì nhảy vào đây, hàm nào xong rồi thì cút. Do bản chất stack nên thằng nào vào sau sẽ cút trước.

  • Queue là hàng đợi sự kiện, mỗi thằng sự kiện mới sẽ chui vào đây, thằng nào vào trước lấy trước. Sự kiện có thể là I/O event, timeout event, interval event, v.v..

  • Event loop là 1 thằng chuyên đi nhặt các sự kiện trong hàng đợi để xử lý. Tuy nhiên nó chỉ nhặt khi và chỉ khi stack trống.

Timeout

Thằng này gà, lúc nào nó cũng bắt buộc phải đặt message của nó ở cuối hàng đợi. Ví dụ

setTimeout(() => {
   //no op
}, 200)

Chạy đến vị trí 200ms nữa, nếu chưa có thằng nào đợi ở đấy mới được đứng, còn không thì cút xuống cuối hàng. Như vậy lúc nào nó cũng phải đợi nhiều hơn, cùng lắm là bằng 200ms.

Immediate

setImmediate(() => {

})

Thằng này là con của bố nó, cháu của ông nó, nên ưu tiên hơn thằng Ao, nó được đứng trước thằng Ao, và chỉ phải chờ các thằng sự kiện vào/ra (I/O).

Như vậy thằng setImmediate được run trước thằng setTimeout, dù setTimeout 0ms.

process.nextTick

process.nextTick(() => {

})

Thằng này thân thế nó cực khủng, không tiện nói ra đây. Chỉ biết nó không thèm đứng vào hàng đợi mà có cửa VIP. Khi nào stack trống, tức là hết tick, nó được thực hiện luôn. Thằng event loop chỉ biết đứng há hốc mồm ra xem mà không dám process event tiếp theo.

Tuy nhiên nó vẫn không thể break được stack đang thực hiện. Công bằng làm sao.


CHÚ Ý: 2 thằng sau chỉ có trong nodejs, không có trong Javascript nói chung. Mà tôi thấy cũng chẳng mấy khi dùng. Bài này viết chỉ để phản đối một ý trong comment của anh Vũ Nhật Minh (@VuNhatMinh): "timeout 0 không "đợi" thêm chút thời gian nào, " ở đây

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Hoàng Duy

24 bài viết.
61 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
40 8
Xin chào, đây là lần đầu tiên mình post bài ở đây. Nhiều vấn đề mình cũng không rành lắm, có gì sai mọi người góp ý nhé. Xin cảm ơn :D Bài này gi...
Hoàng Duy viết 3 năm trước
40 8
White
30 3
Đây là một trong các concept mới đối tượng mới được đưa vào ECMAScript 6. Việc sử dụng chúng rất dễ nhưng để hiểu được thì (đối với tôi) cũng cần k...
Hoàng Duy viết 3 năm trước
30 3
White
27 8
Lâu không post gì muốn viết một bài dài dài về js cơ mà đau đầu quá viết mãi không xong, thôi post bài ngắn vậy :smiley: Lấy screen size ở đây tôi...
Hoàng Duy viết gần 3 năm trước
27 8
Bài viết liên quan
White
43 8
Tăng sức mạnh cho javascript với lodash Lần này mình sẽ giới thiệu 1 thư viện javascript vô cùng bá đạo có tên là "lodash]1]", có thể nói nó là LI...
Huy Hoàng Phạm viết hơn 2 năm trước
43 8
White
1 0
Lâu lâu không động vào nodejs không biết mấy ông tool tiếc này đi đâu về đâu rồi. Trước đây thì mình vẫn có thể dùng istanbul với mocha đơn giản th...
Hoàng Duy viết hơn 1 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
24 bài viết.
61 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!