Ngoại lệ trong các callback bất đồng bộ trong JavaScript
Giả sử, nếu tham số make được truyền vào
là chỉ mục của một phần tử không tồn tại trong mảng -
đó là một tình huống ngoại lệ. Như bạn đã biết,
các ngoại lệ phát sinh bên trong một hàm bất đồng bộ
không thể được bắt qua try-catch.
Trong trường hợp của chúng ta, ngoại lệ phát sinh bên trong
make hoặc callback sẽ không được bắt:
try {
make(10, function(res) {
console.log(res);
});
} catch(err) {
// sẽ không bắt được
}
Trong cách tiếp cận bằng callback, người ta làm việc với ngoại lệ như sau: tham số đầu tiên của callback được dùng để gửi kết quả, và tham số thứ hai - để gửi lỗi. Trong trường hợp này, việc xử lý lỗi diễn ra như sau:
make(10, function(res, err) {
if (!err) {
console.log(res); // không có lỗi xảy ra, in kết quả
} else {
console.log(err); // lỗi xảy ra, in văn bản lỗi
}
});
Hãy sửa đổi mã của hàm
make của chúng ta theo mô tả trên:
function make(num, callback) {
setTimeout(function() {
let arr = [1, 2, 3, 4, 5];
let err;
if (arr[num] === undefined) {
err = 'elem not exists'; // văn bản lỗi
} else {
err = null; // không có lỗi
}
callback(arr[num], err);
}, 3000);
}