Javascript là ngôn ngữ hoạt động theo cơ chế đơn luồng và đồng bộ. Nghĩa là chỉ một đoạn mã có thể được thực thi tại một thời điểm và nó sẽ thực hiện tuần tự. Tuy nhiên, có một số tác vụ như Call API, timeout, đọc tệp... thì Javascript xử lý bất đồng bộ. Chính vì vậy ta cần xử lý bất đồng bộ.
Ví dụ về trường hợp bất đồng bộ trong javascript:
Các cơ chế để xử lý bất đồng bộ
Sử dụng hàm callback để xử lý bất đồng bộ
Một hàm sẽ được truyền vào một hàm khác và sẽ được gọi sau khi tác vụ bất đồng bộ hoàn tất.
Ví dụ với trường hợp timeout bên trên. Có thể sử dụng callback như sau:
Tuy nhiên, nếu có nhiều callback lồng nhau, sẽ dễ dẫn đến vấn đề gọi là "callback hell" làm cho code khó đọc và bảo trì.
Sử dụng Promise để xử lý bất đồng bộ
Promise javascript ra đời từ ES6 (ECMAScript 2015) và nó là một đối tượng đại diện cho một giá trị chưa biết tại thời điểm hiện tại, nhưng sẽ được hoàn thành hoặc bị từ chối trong tương lai. Promise có hai trạng thái chính: resolve (hoàn thành) hoặc reject (thất bại).
Cú pháp để tạo promise
Tương ứng với resolve và reject chúng ta sẽ sử dụng then hoặc catch để xử lý promise
- sử dụng then nếu promise resolve
- sử dụng catch để bắt lỗi nếu promise reject
Về cơ bản thì chúng ta sẽ sử dụng những promise hơn là tạo ra chúng, nhưng điều quan trọng vẫn là bạn phải biết cách tạo ra chúng.
Ví dụ:
Sử dụng hàm bất đồng bộ Async/Await để xử lý bất đồng bộ
Async/await ra đời từ ES7(ECMAScript 2016) , async/await hiểu đơn giản là nó sẽ xử lý các promise. Nghĩa là thay vì chúng ta sử dụng then,catch để lấy dữ liệu và bắt lỗi thì chúng ta sử dụng async/await để làm điều đó.
Cú pháp : Như hàm thông thường nhưng thêm async vào trước function hoặc async vào trước dấu khai báo tham số của hàm arrow function và thêm await vào trước 1 promise
Ví dụ:
Đối với Arrow function