ข้อยกเว้นใน callback แบบ asynchronous ใน JavaScript
สมมติว่าถ้าพารามิเตอร์ make ถูกส่ง
หมายเลขของอิลิเมนต์อาร์เรย์ที่ไม่มีอยู่ -
นี่เป็นสถานการณ์ผิดปกติ อย่างที่คุณทราบดีแล้ว
ข้อยกเว้นที่เกิดขึ้นภายในฟังก์ชัน asynchronous
ไม่สามารถถูกจับได้ด้วย try-catch
ในกรณีของเรา ข้อยกเว้นที่เกิดขึ้นภายใน
make หรือ callback จะไม่ถูกจับ:
try {
make(10, function(res) {
console.log(res);
});
} catch(err) {
// จะไม่ถูกจับ
}
ใน callback approach จะทำงานกับข้อยกเว้น ดังต่อไปนี้: ส่งผลลัพธ์ไปยังพารามิเตอร์แรกของ callback และส่ง error ไปยังพารามิเตอร์ที่สอง ในกรณีนี้ การจัดการข้อผิดพลาดจะเกิดขึ้น ดังต่อไปนี้:
make(10, function(res, err) {
if (!err) {
console.log(res); // ไม่มีข้อผิดพลาดเกิดขึ้น, แสดงผลลัพธ์
} else {
console.log(err); // ข้อผิดพลาดเกิดขึ้น, แสดงข้อความของมัน
}
});
มาแก้ไขโค้ดของฟังก์ชัน
make ของเราตามที่อธิบายไว้:
function make(num, callback) {
setTimeout(function() {
let arr = [1, 2, 3, 4, 5];
let err;
if (arr[num] === undefined) {
err = 'elem not exists'; // ข้อความข้อผิดพลาด
} else {
err = null; // ไม่มีข้อผิดพลาด
}
callback(arr[num], err);
}, 3000);
}