Async function là gì?

Noun Javascript
Hàm bất đồng bộ, hàm không đồng bộ

Lưu ý trước khi xem thuật ngữ này hãy hiểu thuật ngữ promise trước. Hàm bất đồng bộ (async function) là một hàm (function) được khai báo (declare) với từ khóa (keyword) async và từ khóa await được phép sử dụng trong nó. Các từ khóa async và await cho phép hành vi không đồng bộ dựa trên promise được viết theo style rõ ràng hơn, tránh cần phải viết chuỗi promise (promise chain) một cách tường minh (explicitly).

Cú pháp (syntax):


async function name([param[, param[, ...param]]]) {
   statements
}

Các tham số (parameter):

  • name: Tên của hàm
  • param: Tên của một đối số (argument) sẽ được truyền cho hàm.
  • statements: Các câu lệnh (statement) của phần thân (body) của hàm. Cơ chế await có thể được sử dụng.

Giá trị trả về (return value):

Một Promise sẽ được resolve với giá trị được trả về bởi hàm không đồng bộ (async function) hoặc bị reject với một ngoại lệ (exception) được đưa ra từ hoặc không được bắt (uncatch) trong hàm không đồng bộ (async function).

Mô tả:

Các hàm không đồng bộ (async function) có thể chứa không hoặc nhiều biểu thức await. Biểu thức await làm cho các hàm trả về promise hoạt động như thể chúng đồng bộ bằng cách tạm ngừng thực thi cho đến khi promise trả về được fulfill hoặc bị reject. Giá trị đã resolve của promise được coi là giá trị trả về của biểu thức await. Việc sử dụng async và await cho phép sử dụng các khối try / catch thông thường xung quanh mã không đồng bộ (asynchronous code) để bắt các ngoại lệ.

Các hàm không đồng bộ (async function) luôn trả về một promise. Nếu giá trị trả về của một hàm không đồng bộ không phải là một promise một cách tường minh, thì nó sẽ được bao bọc (wrap) một cách ngầm định trong một promise.


async function foo() {
   return 1
}

Là tương tự với:


function foo() {
   return Promise.resolve(1)
}

Trong ví dụ sau, chúng ta liên tiếp await hai promise. Quá trình di chuyển qua hàm foo trong ba giai đoạn.

    
    async function foo() {
       const result1 = await new Promise((resolve) => setTimeout(() => resolve('1')))
       const result2 = await new Promise((resolve) => setTimeout(() => resolve('2')))
    }
    foo()
    
    
    
  • Dòng đầu tiên của thân hàm foo được thực thi đồng bộ (synchronous), với biểu thức await được định cấu hình với promise đang chờ xử lý. Quá trình thông qua foo sau đó bị tạm dừng và quyền điều khiển (control) được trả lại cho hàm đã gọi là foo.
  • Một thời gian sau, khi promise đầu tiên đã được fulfill hoặc bị reject quyền điều khiển sẽ di chuyển trở lại cho foo. Kết quả của việc fullfill promise đầu tiên (nếu nó không bị reject) được trả về từ biểu thức await. Ở đây 1 được gán cho result1. Quá trình này tiếp tục tương tự cho biểu thức await thứ hai.
  • Một thời gian sau, khi promise thứ hai đã được fulfill hoặc bị reject, quyền điều khiển sẽ trở lại foo. Kết quả của fullfill promise thứ hai được trả về từ biểu thức await thứ hai. Ở đây 2 được gán cho result2. Quyền điều khiển di chuyển đến biểu thức trả về (nếu có). Do không có biểu thức trả về nên giá trị trả về mặc định undefined được trả về dưới dạng giá trị fulfill của promise hiện tại.
  • Learning English Everyday