CĂN BẢN
DOM & BOM
XỨ LÝ FORM
JAVASCRIPT TIPS
TUTORIALS
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Cách hoạt động của Event Loop trong JavaScript

Trong JavaScript, Event Loop là một khái niệm quan trọng để hiểu khi làm việc với mã bất đồng bộ. Event Loop là cơ chế quản lý và xử lý các sự kiện và callback trong một môi trường đa luồng như trình duyệt hoặc Node.js.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

event loop in javascript png

Event Loop trong JavaScript

JavaScript là ngôn ngữ lập trình đơn luồng (single-threaded), có nghĩa là nó chỉ thực thi một tác vụ tại một thời điểm. Tuy nhiên, trong một môi trường đa nhiệm như trình duyệt, có nhiều công việc cần được thực hiện đồng thời, chẳng hạn như xử lý sự kiện click, tải dữ liệu từ server, hoặc thực hiện các tác vụ bất đồng bộ khác.

Event Loop giúp quản lý và xử lý các công việc bất đồng bộ bằng cách chờ đợi và xử lý các sự kiện trong một vòng lặp liên tục, đảm bảo rằng các công việc được thực hiện một cách hiệu quả mà không làm đơ trình duyệt hoặc ứng dụng.

console.log("Start");

setTimeout(function() {
    console.log("Inside setTimeout");
}, 0);

console.log("End");'

Khi chạy đoạn mã này, kết quả xuất hiện trên console sẽ là:

Bài viết này được đăng tại [free tuts .net]

screenshot20240305 png

  • console.log("Start") được thêm vào Call Stack và được thực thi trước, hiển thị "Start" trên console.
  • setTimeout() được gọi và chuyển đến Web APIs để thực hiện. Dù thời gian đặt là 0 milisecond, nhưng nó vẫn sẽ phải đợi đến khi Call Stack trống.
  • console.log("End") được thêm vào Call Stack và thực thi, hiển thị "End" trên console.
  • Sau khi thời gian đặt của setTimeout() kết thúc, callback của nó được thêm vào Callback Queue.
  • Event Loop kiểm tra Call Stack, sau đó lấy callback từ Callback Queue và đưa vào Call Stack để thực thi, hiển thị "Inside setTimeout" trên console.

Điều quan trọng cần nhớ ở đây là Event Loop đảm bảo rằng các callback từ Callback Queue chỉ được thực thi khi Call Stack trống. Điều này giúp tránh việc chương trình bị đơ hoặc chậm lại do việc thực thi các tác vụ bất đồng bộ.

Cơ chế hoạt động của Event Loop trong JavaScript

Call Stack

function multiply(x, y) {
    return x * y;
}

function add(x, y) {
    return x + y;
}

const result = multiply(add(2, 3), 4);
console.log(result); // Kết quả: 20

Trong ví dụ này, khi chạy, add(2, 3) được đưa vào Call Stack trước, sau đó là multiply(add(2, 3), 4), và cuối cùng là console.log(result). Khi một hàm kết thúc, nó sẽ bị xóa khỏi Call Stack.

Web APIs

console.log("Start");

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

console.log("End");

Trong ví dụ này, setTimeout() được chuyển đến Web APIs để thực hiện. Nó sẽ đợi trong khoảng thời gian được chỉ định (1000ms), sau đó callback của nó sẽ được đưa vào Callback Queue.

Callback Queue

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

document.addEventListener("click", function() {
    console.log("Click event");
});

Khi sự kiện click xảy ra, callback của nó sẽ được đưa vào Callback Queue và chờ đợi được thực thi.

Event Loop

console.log("Start");

setTimeout(function() {
    console.log("Inside setTimeout");
}, 0);

Promise.resolve().then(function() {
    console.log("Inside Promise");
});

console.log("End");

Trong ví dụ này, sau khi setTimeout() được gọi, nó sẽ đợi Call Stack trống, sau đó callback của nó sẽ được đưa vào Call Stack. Sau đó, Promise.resolve() sẽ được thêm vào Microtasks Queue và callback của nó sẽ được thực thi trước callback của setTimeout() vì Microtasks có ưu tiên cao hơn.

Ví dụ thực hành Event Loop trong JavaScript

console.log("Start");

setTimeout(function() {
    console.log("Inside setTimeout");
}, 0);

function asyncFunction() {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve("Async task completed");
        }, 2000);
    });
}

asyncFunction().then(function(result) {
    console.log(result);
});

console.log("End");

Kết quả sẽ là:

Start
End
Inside setTimeout
Async task completed

Kết bài

Event Loop là một phần quan trọng của JavaScript và làm cho việc xử lý các sự kiện và callback trở nên hiệu quả. Hiểu cách hoạt động của Event Loop là một phần quan trọng của việc trở thành một lập trình viên JavaScript hiệu quả.

Cùng chuyên mục:

Functional Programming là gì? Tại sao và khi nào bạn nên sử dụng trong JavaScript

Functional Programming là gì? Tại sao và khi nào bạn nên sử dụng trong JavaScript

Những tính năng mới trong ES6+ trong JavaScript

Những tính năng mới trong ES6+ trong JavaScript

4 cách tránh memory leaks trong JavaScript

4 cách tránh memory leaks trong JavaScript

Capturing và bubbling Event trong Javascript

Capturing và bubbling Event trong Javascript

Phân biệt prototype và __proto__ trong JavaScript

Phân biệt prototype và __proto__ trong JavaScript

Phương thức bind(), call(), và apply() trong JavaScript

Phương thức bind(), call(), và apply() trong JavaScript

Cách khắc phục lỗi

Cách khắc phục lỗi "hoisting" trong JavaScript

Sử dụng Promise.all và Promise.race để quản lý các Promise trong JavaScript

Sử dụng Promise.all và Promise.race để quản lý các Promise trong JavaScript

Xử lý bất đồng bộ bằng vòng lặp for-await trong JavaScript

Xử lý bất đồng bộ bằng vòng lặp for-await trong JavaScript

Sự khác biệt giữa Promise, Callback và Async/Await trong JavaScript

Sự khác biệt giữa Promise, Callback và Async/Await trong JavaScript

Cách sử dụng Async functions trong JavaScript

Cách sử dụng Async functions trong JavaScript

Hàm String isspace() trong Python

Hàm String isspace() trong Python

Cách tạo số ngẫu nhiên trong Javascript

Cách tạo số ngẫu nhiên trong Javascript

Hướng dẫn cách tạo một số ngẫu nhiên ...

Cách gộp hai object javascript lại với nhau

Cách gộp hai object javascript lại với nhau

Cách lấy chiều dài của object trong Javascript

Cách lấy chiều dài của object trong Javascript

Hướng dẫn giải phương trình bậc 1 bằng Javascript

Hướng dẫn giải phương trình bậc 1 bằng Javascript

Cách dùng nextSibling trong javascript

Cách dùng nextSibling trong javascript

Cách dùng insertAdjacentHTML trong javascript

Cách dùng insertAdjacentHTML trong javascript

Cách dùng innerHTML trong Javascript

Cách dùng innerHTML trong Javascript

Cách dùng insertBefore trong javascript

Cách dùng insertBefore trong javascript

Top