Asynchronous JavaScript là cách JavaScript xử lý các tác vụ không đồng bộ, cho phép chương trình tiếp tục thực thi các đoạn mã khác mà không bị chặn bởi các tác vụ tốn thời gian, như gọi API, truy vấn cơ sở dữ liệu, hoặc đọc/ghi file.
JavaScript sử dụng mô hình bất đồng bộ để xử lý các tác vụ này nhằm tăng hiệu quả và không làm ngưng trệ ứng dụng.
Mô hình hoạt động:
JavaScript sử dụng một kiến trúc gọi là Event Loop để quản lý tác vụ đồng bộ và bất đồng bộ:
- Call Stack (Ngăn xếp thực thi): Nơi JavaScript thực thi các tác vụ đồng bộ.
- Web APIs: Chứa các tác vụ bất đồng bộ, như
setTimeout
, xử lý sự kiện DOM, hoặc HTTP requests. - Task Queue: Khi một tác vụ bất đồng bộ hoàn thành, nó được đẩy vào hàng đợi để chờ thực thi.
- Event Loop: Liên tục kiểm tra Call Stack và Task Queue để quyết định khi nào đẩy các tác vụ từ Task Queue vào Call Stack.
Cách xử lý bất đồng bộ trong JavaScript:
Có ba cách chính để xử lý bất đồng bộ:
1. Callbacks:
- Là cách phổ biến và lâu đời nhất để xử lý bất đồng bộ.
- Một hàm được truyền vào và được gọi khi tác vụ hoàn thành.
Ví dụ:
console.log('Start'); setTimeout(() => { console.log('This is async'); }, 2000); console.log('End'); |
Start End This is async |
2. Promises:
- Promises là một cơ chế hiện đại hơn để xử lý bất đồng bộ, giúp cải thiện vấn đề callback hell.
- Một Promise có thể ở ba trạng thái:
- Pending (Đang chờ): Tác vụ chưa hoàn thành.
- Resolved (Hoàn thành): Tác vụ thành công.
- Rejected (Thất bại): Tác vụ gặp lỗi.
const fetchData = new Promise((resolve, reject) => { setTimeout(() => { resolve("Data received"); }, 2000); }); fetchData .then(data => console.log(data)) // "Data received" .catch(error => console.error(error)); |
3. Async/Await:
- Cung cấp cú pháp dễ đọc và viết hơn khi làm việc với Promises.
- Từ khóa
async
biến một hàm thành bất đồng bộ, vàawait
được dùng để chờ một Promise hoàn thành trước khi tiếp tục.
async function fetchData() { console.log('Fetching...'); const data = await new Promise(resolve => setTimeout(() => resolve('Data received'), 2000)); console.log(data); } fetchData(); |
Các tình huống sử dụng Asynchronous JavaScript:
- Gọi API: Lấy dữ liệu từ server bằng
fetch
hoặcaxios
. - Xử lý sự kiện: Đăng ký các sự kiện như
click
,keydown
. - Đọc/Ghi File: Làm việc với hệ thống file qua Node.js.
- Thao tác thời gian: Sử dụng
setTimeout
hoặcsetInterval
để thực thi sau một khoảng thời gian.
Ưu điểm của Asynchronous JavaScript:
- Hiệu quả cao: JavaScript có thể thực hiện nhiều tác vụ đồng thời mà không chặn chương trình.
- Trải nghiệm người dùng tốt: Giao diện không bị đơ khi chờ tác vụ hoàn thành.
Nhược điểm:
- Callback Hell: Nếu không quản lý tốt các callback, mã trở nên khó đọc.
- Debug khó khăn: Xử lý lỗi trong mã bất đồng bộ phức tạp hơn.
Tóm lại:
Asynchronous JavaScript là nền tảng để xây dựng các ứng dụng web hiện đại, nơi tốc độ và khả năng xử lý tác vụ đồng thời là yếu tố quan trọng. Nó hoạt động thông qua callbacks, promises, và async/await, giúp xử lý các tác vụ dài mà không làm gián đoạn luồng chính của chương trình.

Dương Trần Hà, hiện mình đang là kỹ công nghệ phần mềm và cũng là giám đốc thành lập công ty DTH Solutions. Mình có nhiều năm kinh nghiệm, kiến thức chuyên môn lập trình, nodejs, nestjs, laravel, yii2, reactjs, nextjs. Mình đã phát triển rất nhiều dự án thực tế cho doanh nghiệp, cơ quan. Mình đã đạt được một số thành công nhỏ, đồng thời mình vẫn đang tiếp tục học tập để trau dồi kiến thức mỗi ngày. Mình rất yêu thích công nghệ, đam mê chia sẻ những kiến thức, thông tin hữu ích cho mọi người.