ข้ามไปยังเนื้อหา

Callbacks

Callback คือฟังก์ชันที่คุณส่งให้อีกฟังก์ชันหนึ่ง เพื่อให้ถูกเรียกภายหลังเมื่องานทำเสร็จ นี่คือวิธีดั้งเดิมของ JavaScript ในการจัดการงาน async — ส่งฟังก์ชันเข้าไป แล้ว runtime จะเรียกกลับเมื่อผลลัพธ์พร้อม

setTimeout(function() {
console.log('This runs after 1 second');
}, 1000);

อาร์กิวเมนต์ตัวที่สองของ setTimeout คือ callback คุณมอบการควบคุมให้ runtime แล้วฟังก์ชันของคุณจะถูกเรียกกลับเมื่อ timer ทำงาน

API ในตัวของ Node ใช้ signature ที่สม่ำเสมอสำหรับ callback:

fs.readFile('data.txt', 'utf8', function(err, data) {
if (err) {
console.error('Read failed:', err.message);
return;
}
console.log('File contents:', data);
});

รูปแบบคือ (err, data) — error มาก่อนเสมอ ผลลัพธ์มาทีหลัง ถ้างานสำเร็จ err จะเป็น null ถ้าล้มเหลว err จะเป็นออบเจ็กต์ Error และ data จะเป็น undefined

ตรวจ err ก่อนใช้ data เสมอ ถ้าคุณเพิกเฉยต่อ err ที่ไม่เป็น null แล้วพยายามใช้ data คุณจะเจอ error ที่งงงวย

เมื่องาน async หนึ่งขึ้นอยู่กับผลของอีกงานหนึ่ง คุณต้องซ้อน callback:

step1(function(err, resultA) {
if (err) return handleError(err);
step2(resultA, function(err, resultB) {
if (err) return handleError(err);
step3(resultB, function(err, resultC) {
if (err) return handleError(err);
console.log('Final:', resultC);
});
});
});

การซ้อนลึกเช่นนี้ — บางทีเรียกว่า callback hell หรือ pyramid of doom — อ่านยากและผิดพลาดง่าย Promise และ async/await (ในบทถัดไป) ช่วยแก้ปัญหานี้

สนิปเป็ตด้านล่างจำลองสองขั้นตอน async ด้วย setTimeout แต่ละขั้นใช้รูปแบบ callback แบบ error-first ลองรันเพื่อดูลำดับผลลัพธ์

JavaScript

ผลลัพธ์จะเป็น Step 1 done: result-A แล้วตามด้วย Step 2 done: result-B เสมอ — แต่ละขั้นทำงานหลังขั้นก่อนหน้าทำเสร็จเท่านั้น

signature ที่ถูกต้องของ callback แบบ error-first ใน Node.js คือข้อใด?
ในรูปแบบ callback แบบ error-first เมื่อสำเร็จ err มีค่าเป็นอะไร?
"callback hell" คืออะไร?