Tính đồng thời với Javascript trong trình duyệt và Node.js (tiếp tục)
Chúng ta có thể thấy không đồng bộ này trong thực tế bằng cách sử dụng setTimeout, một hàm cái bạn có thể quen
thuộc với từ frontend code. Nó chờ một số mili giây được chỉ ra và sau đó thực thi code chỉ ra trong hàm callback.
Ví dụ, nếu chúng ta chạy code sau (với một Node.js script hay trong trình duyệt, kết quả là tương tự cho cả hai):
console.log(‘first’)
setTimeout(() => {console.log(‘second’)
}, 1000)
console.log(‘third’)
Chúng ta có thể thấy rằng chúng được in trong trật tự sau:
first
third
second
Cái này có ý nghĩa, vì chúng ta đang trì hoãn “second” console.log bằng một giây. Tuy nhiên, cùng đầu ra sẽ xảy
ra nếu chúng ta thực thi code sau:
console.log(‘first’)
setTimeout(() => {console.log(‘second’)
}, 0)
console.log(‘third’)
Bây giờ rằng chúng ta đang chờ 0 mili giây trước khi thực thi code, bạn sẽ nghĩ rằng second được in sau first. Tuy
nhiên, chúng ta nhận cùng đầu ra như trước:
first
third
second
Lí do là rằng khi chúng ta sử dụng setTimeout, bộ máy Javascript gọi hoặc một web API (trên trình duyệt) hoặc một
API bản địa (trên Node.js). API này chạy trong code bản địa trong bộ máy, theo dấu timeout bên trong, và đặt callback
vào task queue, vì timer hoàn thành ngay khỏi. Trong khi cái này đang xảy ra, bộ máy Javascript tiếp tục xử lí code
khác bằng cách đẩy nó lên trên stack và thực thi nó. Khi stack là rỗng (không có nhiều code hơn để thực thi), event
loop tiến lên. Nó thấy rằng có thứ gì đó trong task queue, nên nó thực thi code đó, dẫn đến second được in cuối cùng.
Tip
Bạn có thể sử dụng công cụ Loupe để ảnh hóa các làm việc nội bộ của Call Stack, web APIs, Event Loop, và
Callback/Task Queue: http://latentflip.com/loupe/.
Bây giờ rằng chúng ta đã học code không đồng bộ được xử lí như thế nào trong trình duyệt và Node.js, hãy tạo
web server đầu tiên của chúng ta với Node.js!