Hàm gọi lại
Hàm gọi lại (callback) là một hàm được truyền vào một hàm khác như một đối số, sau đó được gọi bên trong hàm bên ngoài để hoàn thành một quy trình hoặc hành động nào đó.
Người dùng API dựa trên callback viết một hàm được truyền vào API. Nhà cung cấp API (được gọi là caller - người gọi) nhận hàm và gọi lại (hoặc thực thi) hàm đó tại một thời điểm nào đó bên trong thân của caller. Caller chịu trách nhiệm truyền đúng các tham số vào hàm callback. Caller cũng có thể mong đợi một giá trị trả về cụ thể từ hàm callback, được sử dụng để hướng dẫn thêm hành vi của caller.
Có hai cách mà callback có thể được gọi: đồng bộ và bất đồng bộ. Các callback đồng bộ được gọi ngay sau khi gọi hàm bên ngoài, không có bất kỳ tác vụ bất đồng bộ nào xen vào, trong khi các callback bất đồng bộ được gọi vào một thời điểm nào đó sau đó, sau khi một hoạt động bất đồng bộ đã hoàn thành.
Hiểu liệu callback được gọi đồng bộ hay bất đồng bộ đặc biệt quan trọng khi phân tích các tác dụng phụ. Xem xét ví dụ sau:
let value = 1;
doSomething(() => {
value = 2;
});
console.log(value); // 1 hay 2?
Nếu doSomething gọi callback đồng bộ, thì câu lệnh cuối cùng sẽ ghi 2 vì value = 2 được thực thi đồng bộ; ngược lại, nếu callback là bất đồng bộ, câu lệnh cuối cùng sẽ ghi 1 vì value = 2 chỉ được thực thi sau câu lệnh console.log.
Ví dụ về callback đồng bộ bao gồm các callback được truyền vào Array.prototype.map(), Array.prototype.forEach(), v.v. Ví dụ về callback bất đồng bộ bao gồm các callback được truyền vào setTimeout() và Promise.prototype.then(). Đây là các triển khai mẫu của doSomething gọi callback đồng bộ và bất đồng bộ:
// Đồng bộ
function doSomething(callback) {
callback();
}
// Bất đồng bộ
function doSomething(callback) {
setTimeout(callback, 0);
}
Hướng dẫn Sử dụng promise có thêm thông tin về thời điểm của các callback bất đồng bộ.