Tuyển dụng
Viettel IDC

Async/Await là gì? Cú pháp khai báo và ví dụ Async/Await trong Javascript

05/05/2026

Khi xử lý bất đồng bộ, việc sử dụng callback hay Promise đôi khi khiến code trở nên khó đọc và khó kiểm soát. Async/await ra đời như một cách viết đơn giản hơn, giúp luồng xử lý rõ ràng và trực quan hơn. Cùng Viettel IDC tìm hiểu async/await là gì, cú pháp khai báo và ví dụ minh hoạ trong JS.

Async/Await là gì?

Async/await là cú pháp được sử dụng để xử lý các tác vụ bất đồng bộ một cách dễ hiểu và trực quan hơn. Thay vì phải sử dụng callback hoặc Promise chaining phức tạp, async/await giúp code trông giống như đang chạy tuần tự, từ đó cải thiện đáng kể khả năng đọc và bảo trì. Cơ chế này vẫn dựa trên Promise, nhưng cách viết gọn gàng và rõ ràng hơn rất nhiều, đặc biệt phù hợp với các luồng xử lý dữ liệu như gọi API hoặc xử lý nhiều bước liên tiếp.

Các thành phần chính:

- async: dùng để khai báo một hàm theo cơ chế bất đồng bộ. Khi một hàm có từ khóa này, nó sẽ luôn trả về một Promise, kể cả khi bạn return một giá trị thông thường.

- await: dùng để chờ một Promise hoàn thành và trả về kết quả. Khi gặp await, chương trình sẽ tạm dừng thực thi trong phạm vi hàm async cho đến khi Promise resolve hoặc reject, sau đó mới tiếp tục chạy các dòng code phía sau.

Async/Await là gì?

Cơ chế hoạt động của Async/await là gì?

Async/await hoạt động dựa trên Promise và cơ chế xử lý bất đồng bộ của JavaScript. Khi một hàm được khai báo với async, kết quả trả về của hàm đó luôn được đóng gói dưới dạng Promise. Trong quá trình thực thi, nếu JavaScript gặp từ khóa await, nó sẽ tạm ngưng phần xử lý bên trong hàm async để chờ Promise hoàn tất. Sau khi Promise trả về kết quả thành công hoặc phát sinh lỗi, chương trình sẽ tiếp tục chạy các câu lệnh còn lại trong hàm.

Cách hoạt động của async/await có thể được hiểu theo trình tự sau:

- Hàm async được gọi → Trả về một Promise

- Khi gặp await → Tạm dừng trong phạm vi hàm đó

- JavaScript tiếp tục xử lý các tác vụ khác trong event loop

- Khi Promise hoàn thành → Quay lại thực thi tiếp phần còn lại của hàm

Cơ chế hoạt động của Async/await là gì?

Vì sao cần async/await?

Async/await được sử dụng rộng rãi, giúp việc xử lý bất đồng bộ trong JavaScript trở nên đơn giản, rõ ràng và dễ kiểm soát hơn so với các phương pháp truyền thống. Nhờ cú pháp trực quan và cách hoạt động gần giống với code đồng bộ, async/await mang lại nhiều lợi ích quan trọng trong quá trình phát triển ứng dụng:

- Code dễ đọc, dễ hiểu: Thay vì lồng ghép nhiều hàm .then(), bạn có thể viết code theo trình tự tuyến tính, giúp người đọc dễ theo dõi luồng xử lý dữ liệu.

- Tránh Callback Hell: Giải quyết vấn đề code bị lồng nhau quá nhiều tầng, giúp cấu trúc chương trình sạch sẽ hơn.

- Xử lý lỗi đơn giản: Bạn có thể sử dụng cú pháp try/catch truyền thống để bắt lỗi từ các tác vụ bất đồng bộ, giống như cách làm với code đồng bộ.

- Xử lý bất đồng bộ hiệu quả: Tạm dừng thực thi hàm (await) cho đến khi Promise trả về kết quả, nhưng không làm chặn (block) luồng chính (main thread) của chương trình.

- Phổ biến trong các tác vụ thực tế: Đặc biệt hữu ích khi cần gọi API lấy dữ liệu, thao tác cơ sở dữ liệu hoặc xử lý tệp tin.

Cú pháp khai báo async/await là gì?

Cú pháp async/await trong JavaScript dùng để xử lý bất đồng bộ, giúp mã nguồn dễ đọc hơn. Từ khóa async đặt trước hàm để biến nó thành hàm bất đồng bộ trả về Promise. Từ khóa await (chỉ dùng trong hàm async) dừng thực thi để chờ kết quả Promise.

Khai báo hàm với async

Để định nghĩa một hàm bất đồng bộ, bạn thêm từ khóa async phía trước hàm. Khi đó, bất kể bên trong hàm trả về giá trị gì, JavaScript cũng sẽ tự động chuyển nó thành một Promise. Nhờ vậy, hàm async luôn có thể kết hợp với các thao tác bất đồng bộ khác.

 

async function getData() {
  return "Dữ liệu đã sẵn sàng";
}

Hàm getData() không trả về trực tiếp chuỗi mà trả về một Promise chứa giá trị đó. Khi gọi hàm, bạn có thể dùng .then() hoặc await để lấy kết quả.

Sử dụng await để chờ kết quả

Từ khóa await chỉ có thể sử dụng bên trong hàm async và được dùng để chờ một Promise hoàn thành. Khi chương trình gặp await, nó sẽ tạm dừng việc thực thi tại dòng đó cho đến khi Promise trả về kết quả, sau đó mới tiếp tục chạy các câu lệnh phía sau.

async function showData() {
const result = await getData();
console.log(result);
}

Giá trị trả về từ getData() sẽ được gán vào biến result sau khi Promise hoàn thành. Luồng xử lý diễn ra theo thứ tự từ trên xuống nên dễ đọc và dễ kiểm soát hơn.

Kết hợp try/catch khi xử lý lỗi

Khi làm việc với async/await, việc xử lý lỗi thường được thực hiện bằng khối try/catch. Cách này giúp bắt cả lỗi đồng bộ và bất đồng bộ trong cùng một cấu trúc.

async function fetchData() {
try {
  const response = await fetch("https://api.example.com/data");
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error("Có lỗi xảy ra:", error);
}
}

Nếu Promise bị reject hoặc có lỗi trong quá trình xử lý dữ liệu, chương trình sẽ chuyển sang khối catch. Nhờ đó, lỗi được kiểm soát rõ ràng và không làm gián đoạn toàn bộ ứng dụng.

Ví dụ async/await trong javascript dễ hiểu

Để hiểu rõ hơn, hãy xét một tình huống thực tế: Bạn cần lấy thông tin người dùng từ API, sau đó dùng userId để lấy danh sách bài viết của người đó.

- Với Promise và .then()

 

function getUser() {
  return fetch('https://api.example.com/user')
    .then(res => res.json());
}

function getPosts(userId) {
  return fetch(`https://api.example.com/posts?userId=${userId}`)
    .then(res => res.json());
}

getUser()
  .then(user => {
    return getPosts(user.id);
  })
  .then(posts => {
    console.log(posts);
  })
  .catch(error => {
    console.error(error);
  });

 

- Với async/await

async function fetchData() {
  try {
    const user = await fetch('https://api.example.com/user')
      .then(res => res.json());

    const posts = await fetch(`https://api.example.com/posts?userId=${user.id}`)
      .then(res => res.json());

    console.log(posts);
  } catch (error) {
    console.error(error);
  }
}

fetchData();

Trong hai ví dụ trên, cả Promise và async/await đều xử lý cùng một luồng logic, tuy nhiên cách thể hiện có sự khác biệt rõ rệt. Với Promise, code được viết theo kiểu chaining các hàm .then(), trong khi async/await cho phép viết theo trình tự từ trên xuống giống như code đồng bộ. Luồng xử lý trở nên trực quan hơn, dễ đọc hơn và thuận tiện hơn khi mở rộng hoặc bảo trì trong các bài toán thực tế có nhiều bước xử lý liên tiếp.

So sánh async/await vs promise vs callback

Trong JavaScript, xử lý bất đồng bộ đã trải qua nhiều giai đoạn phát triển, từ callback đến Promise và sau đó là async/await. Mỗi cách đều có đặc điểm riêng, nhưng async/await được xem là cách viết hiện đại và tối ưu nhất hiện nay.

 

Tiêu chí

Callback

Promise

Async/Await

Cách viết

Truyền hàm vào hàm khác

Dùng .then() để xử lý

Viết như code tuần tự

Độ dễ đọc

Thấp, dễ rối khi lồng nhiều

Tốt hơn callback

Rõ ràng, dễ hiểu nhất

Quản lý lỗi

Khó kiểm soát

Dùng .catch()

Dùng try/catch trực quan

Khả năng mở rộng

Khó bảo trì

Tương đối tốt

Dễ mở rộng, dễ maintain

Debug

Khó

Trung bình

Dễ debug hơn

 

So sánh async/await vs promise vs callback

Lỗi thường gặp khi dùng async/await và cách khắc phục nhanh

Khi sử dụng async/await, lập trình viên thường gặp một số lỗi phổ biến liên quan đến cách dùng cú pháp và hiểu sai cơ chế hoạt động. Những lỗi này có thể khiến code không chạy đúng như mong muốn hoặc gây khó khăn trong quá trình debug.

Quên sử dụng await

Một lỗi phổ biến là gọi hàm trả về Promise nhưng không dùng await, dẫn đến việc nhận về Promise thay vì dữ liệu thực tế.

async function getData() {
return "Hello";
}

async function main() {
const data = getData(); // thiếu await
console.log(data);
}

Trong trường hợp này, biến data sẽ là một Promise thay vì giá trị "Hello". Khi thêm await, chương trình mới trả về đúng dữ liệu mong muốn.

Dùng await ngoài hàm async

Await chỉ hoạt động bên trong hàm được khai báo với async. Trong trường hợp dùng await bên ngoài hàm async, JavaScript sẽ phát sinh lỗi vì cú pháp này chỉ hợp lệ khi nằm trong một hàm bất đồng bộ.

const data = await getData(); // lỗi

Để khắc phục, cần đặt đoạn code này bên trong một hàm async hoặc sử dụng .then() thay thế.

Không xử lý lỗi với try/catch

Khi Promise bị reject mà không có xử lý lỗi, ứng dụng có thể bị crash hoặc gây ra lỗi không kiểm soát.

async function main() {
const data = await fetchData();
console.log(data);
}

Nếu fetchData() xảy ra lỗi, chương trình sẽ dừng đột ngột. Việc sử dụng try/catch giúp kiểm soát và xử lý lỗi rõ ràng hơn.

Chạy tuần tự không cần thiết

Nhiều trường hợp các Promise không phụ thuộc nhau nhưng vẫn được viết theo kiểu tuần tự, làm giảm hiệu năng.

const a = await getA();
const b = await getB();

Nếu hai hàm không liên quan, có thể chạy song song để tối ưu thời gian bằng Promise.all().

Hiểu sai await là đồng bộ hoàn toàn

Một số người cho rằng await làm chương trình chạy đồng bộ hoàn toàn, nhưng thực tế chỉ tạm dừng trong phạm vi hàm async.

async function test() {
console.log("Start");
await new Promise(resolve => setTimeout(resolve, 2000));
console.log("End");
}

Trong thời gian chờ, JavaScript vẫn tiếp tục xử lý các tác vụ khác trong event loop. Code vẫn mang bản chất bất đồng bộ, chỉ là cách viết trở nên tuần tự hơn.

Kết luận

Async/Await là gì là kiến thức nền tảng khi làm việc với JavaScript. Khi nắm rõ cơ chế và cách sử dụng, bạn có thể tổ chức luồng xử lý logic một cách mạch lạc, dễ đọc và hạn chế lỗi. Kết hợp linh hoạt với Promise sẽ giúp tối ưu hiệu năng và nâng cao chất lượng code trong các bài toán như gọi API, xử lý dữ liệu hay phát triển ứng dụng web.

Để được hỗ trợ tư vấn và tìm hiểu các dịch vụ của Viettel, bạn có thể liên hệ trực tiếp tới Viettel IDC qua các kênh:

- Hotline: 1800 8088 (miễn phí cước gọi)

- Fanpage: https://www.facebook.com/viettelidc  

Bình luận ()

Đăng nhập | Đăng ký
để gửi bình luận
Ý kiến của bạn sẽ được xét duyệt trước khi đăng.
Ý kiến của bạn sẽ được xét duyệt trước khi đăng.
Ý kiến của bạn sẽ được xét duyệt trước khi đăng.
Xem thêm bình luận

Tin liên quan

28/09/2026

Trigger là gì trong DBMS? Cách hoạt động, các loại phổ biến và ứng dụng

Trigger là gì trong DBMS? Tìm hiểu cách trigger hoạt động, các loại phổ biến, ví dụ minh họa, ưu nhược điểm và khi nào nên sử dụng.

28/09/2026

Figma là gì? Nền tảng thiết kế và cộng tác trực tuyến

Figma là gì, có những tính năng nổi bật nào? Tìm hiểu Vector Network, Auto Layout, Dev Mode và vị thế hiện tại của Figma trong ngành thiết kế.

28/09/2026

Camera Cloud cần tốc độ mạng bao nhiêu? Cách tính băng thông cần thiết

Camera Cloud cần tốc độ mạng bao nhiêu? Tìm hiểu mức băng thông cần thiết, cách tính upload và các yếu tố ảnh hưởng đến tốc độ khi sử dụng Camera Cloud.

28/09/2026

Camera Cloud có bị hack không? Nguyên nhân và cách bảo mật

Camera Cloud có bị hack không? Tìm hiểu các rủi ro bảo mật, nguyên nhân bị xâm nhập và cách bảo vệ camera, tài khoản cùng dữ liệu hiệu quả.

28/09/2026

Viettel IDC: Nhà cung cấp VMware Sovereign Cloud duy nhất tại Đông Nam Á

Tại VMware Explore 2026 ở Las Vegas, Broadcom đã giới thiệu nhóm 57 nhà cung cấp dịch vụ đám mây chủ quyền trên nền tảng VMware Cloud Foundation. Viettel IDC là đơn vị duy nhất tại Đông Nam Á có tên trong danh sách này, đánh dấu bước tiến mới của doanh nghiệp Việt Nam trên thị trường hạ tầng cloud khu vực.

25/09/2026

Ghidra là gì? Chức năng và ứng dụng trong reverse engineering

Ghidra là gì? Tìm hiểu công cụ reverse engineering mã nguồn mở của NSA, các chức năng chính, ứng dụng thực tế và điểm khác biệt với IDA Pro.

25/09/2026

10 công cụ tối ưu hóa website theo từng mục tiêu

Tổng hợp 10 công cụ tối ưu hóa web cho tốc độ, SEO, trải nghiệm người dùng và chuyển đổi, kèm bảng so sánh và gợi ý lựa chọn theo nhu cầu.

25/09/2026

So sánh WHOIS và DNS Lookup: Điểm khác nhau và khi nào nên sử dụng

WHOIS và DNS Lookup khác nhau thế nào? Tìm hiểu định nghĩa, bảng so sánh, vai trò của RDAP thay thế WHOIS, và khi nào nên dùng công cụ nào.

25/09/2026

Cách test tải hệ thống: Quy trình và công cụ phổ biến

Cách test tải hệ thống hiệu quả gồm những bước nào? Tìm hiểu quy trình, chỉ số cần đo và công cụ phổ biến như JMeter, k6.

16/01/2025

Cloud Monitoring là gì? So sánh Hybrid Cloud và Multi Cloud Monitoring

Cloud Monitoring là quá trình theo dõi, quản lý và đánh giá hiệu suất của các tài nguyên và dịch vụ đám mây, bao gồm giám sát máy chủ, cơ sở dữ liệu, ứng dụng và hệ thống mạng