chức năng Một callback chỉ đơn giản là một chức năng bạn vượt qua thành chức năng khác để chức năng có thể gọi nó là tại một thời điểm sau đó. Điều này thường thấy trong không đồng bộ API s; cuộc gọi API trả về ngay lập tức vì nó không đồng bộ, vì vậy bạn chuyển một hàm vào API mà API có thể gọi khi thực hiện xong nhiệm vụ không đồng bộ của nó.
Ví dụ đơn giản nhất mà tôi có thể nghĩ đến trong JavaScript là hàm setTimeout()
. Đó là một hàm toàn cục chấp nhận hai đối số. Đối số đầu tiên là hàm gọi lại và đối số thứ hai là một sự chậm trễ tính bằng mili giây.Hàm được thiết kế để đợi khoảng thời gian thích hợp, sau đó gọi hàm gọi lại của bạn.
setTimeout(function() {
console.log("10 seconds later...");
}, 10000);
Bạn có thể đã thấy mã ở trên trước đây nhưng không nhận ra chức năng bạn đang chuyển vào được gọi là chức năng gọi lại. Chúng tôi có thể viết lại đoạn mã trên để làm rõ hơn.
var callback = function() {
console.log("10 seconds later...");
};
setTimeout(callback, 10000);
Gọi lại được sử dụng khắp nơi trong Nút vì Nút được xây dựng từ mặt đất đến không đồng bộ trong mọi thứ. Ngay cả khi nói chuyện với hệ thống tập tin. Đó là lý do tại sao một tấn Node API nội bộ chấp nhận các chức năng gọi lại như các đối số thay vì trả về dữ liệu mà bạn có thể gán cho một biến. Thay vào đó, nó sẽ gọi hàm gọi lại của bạn, truyền dữ liệu mà bạn muốn làm đối số. Ví dụ, bạn có thể sử dụng thư viện fs
của Node để đọc một tệp. Mô-đun fs
hiển thị hai hàm API duy nhất: readFile
và readFileSync
.
Chức năng readFile
không đồng bộ trong khi readFileSync
rõ ràng là không. Bạn có thể thấy rằng họ dự định bạn sử dụng các cuộc gọi không đồng bộ bất cứ khi nào có thể vì họ gọi họ là readFile
và readFileSync
thay vì readFile
và readFileAsync
. Đây là một ví dụ về việc sử dụng cả hai hàm.
Synchronous:
var data = fs.readFileSync('test.txt');
console.log(data);
Đoạn mã trên thực hiện khối thread cho đến khi tất cả các nội dung của test.txt
được đọc vào bộ nhớ và lưu trữ trong biến data
. Trong nút này thường được coi là thực hành xấu. Đôi khi, khi nó hữu ích, chẳng hạn như khi viết một kịch bản nhỏ nhanh để làm một cái gì đó đơn giản nhưng tẻ nhạt và bạn không quan tâm nhiều về việc tiết kiệm từng giây nano của thời gian mà bạn có thể.
Asynchronous (với callback):
var callback = function (err, data) {
if (err) return console.error(err);
console.log(data);
};
fs.readFile('test.txt', callback);
Đầu tiên chúng ta tạo một hàm callback mà chấp nhận hai đối số err
và data
. Một vấn đề với các hàm không đồng bộ là nó trở nên khó khăn hơn trong việc bẫy các lỗi nên rất nhiều API kiểu gọi lại truyền các lỗi như là đối số đầu tiên cho hàm gọi lại. Cách tốt nhất là kiểm tra xem err
có giá trị hay không trước khi bạn làm bất cứ điều gì khác. Nếu vậy, hãy ngừng thực hiện cuộc gọi lại và đăng nhập lỗi.
Cuộc gọi đồng bộ có lợi thế khi có trường hợp ngoại lệ được ném vì bạn có thể chỉ cần bắt chúng với khối try/catch
.
try {
var data = fs.readFileSync('test.txt');
console.log(data);
} catch (err) {
console.error(err);
}
Trong các chức năng không đồng bộ, nó không hoạt động theo cách đó. Cuộc gọi API trả về ngay lập tức để không có gì bắt được với try/catch
. Các API không đồng bộ thích hợp sử dụng các cuộc gọi lại sẽ luôn luôn bắt lỗi của riêng chúng và sau đó chuyển các lỗi đó vào trong hàm gọi lại nơi bạn có thể xử lý nó khi bạn thấy phù hợp.
Ngoài các cuộc gọi lại, có một kiểu API phổ biến khác thường được sử dụng được gọi là lời hứa. Nếu bạn muốn đọc về chúng thì bạn có thể đọc toàn bộ bài đăng trên blog mà tôi đã viết dựa trên câu trả lời này here.
một ví dụ về cách viết một hàm mà phải mất một callback như một cuộc tranh cãi? – Gntem
yeah một cái gì đó như thế, bất kỳ ví dụ đơn giản mà giúp tôi hiểu nó. –
Gọi lại là một hàm mà bạn chuyển làm tham số cho một chức năng khác ... Google pls -> "gọi lại javascript" -> kết quả đầu tiên –