Timeout และการยกเลิกด้วย AbortController
เพิ่ม timeout ให้โค้ด async และยกเลิกงานด้วย AbortController เชื่อมสัญญาณเข้ากับงานเพื่อหยุดได้เร็วขึ้น
Timeout และการยกเลิกด้วย AbortController เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
เหตุใดจึงต้องกำหนดเวลาหมดและยกเลิก
เป้าหมาย: หยุดงานที่ใช้เวลานานอย่างปลอดภัย
- เพิ่มการกำหนดเวลาหมดอย่างง่าย
- ใช้ AbortController
- เชื่อมสัญญาณเข้ากับงาน
- เก็บกวาดตัวจับเวลา

งานที่รับรู้สัญญาณ
สร้างงานที่ฟัง signal.abort และหยุดตัวจับเวลาเมื่อยกเลิก
// Fake fetch that respects AbortSignal
function fakeFetch(ms, value, signal) {
return new Promise(function (resolve, reject) {
// Abort handler
function onAbort() {
clearTimeout(t);
reject(new Error("aborted"));
}
// If already aborted
if (signal && signal.aborted) {
return reject(new Error("aborted"));
}
// Finish timer
const t = setTimeout(function () {
if (signal) {
signal.removeEventListener("abort", onAbort);
}
resolve(value);
}, ms);
// Listen for abort
if (signal) {
signal.addEventListener("abort", onAbort);
}
});
}
fakeFetch(5, "OK").then(function (v) {
console.log("fakeFetch:", v);
});

การยกเลิกขณะทำงาน
สร้าง controller ส่งสัญญาณของมันไป และเรียก abort() เพื่อยกเลิก
// AbortController cancels signal-aware tasks
const controller = new AbortController();
fakeFetch(20, "Too slow", controller.signal)
.then(function (v) {
console.log("done:", v);
})
.catch(function (e) {
console.log("catch:", e.message);
});
// Abort after a short delay
setTimeout(function () {
controller.abort();
console.log("aborted");
}, 5);

ตัวครอบการกำหนดเวลาหมด
ใช้ Promise.race เพื่อปฏิเสธเมื่อ งานใช้เวลานานเกินไป และล้างตัวจับเวลาในขั้นตอนสุดท้าย
// Add a timeout to any Promise with Promise.race
function withTimeout(promise, ms) {
return Promise.race([
promise,
new Promise(function (_resolve, reject) {
const t = setTimeout(function () {
reject(new Error("timeout"));
}, ms);
// Small trick: clear timer when the main promise settles
promise.finally(function () { clearTimeout(t); });
})
]);
}
// Demo: this will time out
withTimeout(fakeFetch(30, "late"), 10)
.then(function (v) { console.log("value:", v); })
.catch(function (e) { console.log("timeout:", e.message); });

การกำหนดเวลาหมดและการยกเลิกพร้อมกัน
หากการกำหนดเวลาหมดเกิดขึ้นก่อน ให้เรียก abort() เพื่อหยุดงานเบื้องหลังตั้งแต่เนิ่น ๆ
// Combine: abort if timeout fires
async function fetchWithTimeout(msWork, msTimeout) {
const c = new AbortController();
const task = fakeFetch(msWork, "data", c.signal);
// If timeout wins, abort the task
try {
const result = await withTimeout(task, msTimeout);
return result;
} catch (e) {
c.abort();
throw e;
}
}
fetchWithTimeout(25, 10)
.then(function (v) { console.log("got:", v); })
.catch(function (e) { console.log("failed:", e.message); });

เคล็ดลับและรายการตรวจสอบ
เคล็ดลับ:
- ล้างตัวจับเวลาในขั้นตอนสุดท้ายเสมอ
- ส่งสัญญาณเข้าไปในงานและตรวจสอบ signal.aborted
- ควรใช้ controller หนึ่งตัวต่อคำขอหนึ่งรายการ

แบบทดสอบพื้นฐาน AbortController
ตรวจสอบอย่างรวดเร็ว: รูปแบบการยกเลิก

ทบทวน
ทบทวน: คุณสร้างงานที่รองรับสัญญาณ ยกเลิกงานด้วย AbortController เพิ่มการกำหนดเวลาหมดเวลาผ่าน Promise.race และผสานทั้งสองวิธีเพื่อออกจากการทำงานก่อนกำหนดอย่างปลอดภัย

คำถามที่พบบ่อย
บทเรียน “Timeout และการยกเลิกด้วย AbortController” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Timeout และการยกเลิกด้วย AbortController” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Timeout และการยกเลิกด้วย AbortController”
เพิ่ม timeout ให้โค้ด async และยกเลิกงานด้วย AbortController เชื่อมสัญญาณเข้ากับงานเพื่อหยุดได้เร็วขึ้น คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน
บทเรียน “Timeout และการยกเลิกด้วย AbortController” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม
ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียนฟังก์ชัน async; try/catch; แบบขนานกับแบบลำดับ
- Timeout และการยกเลิกด้วย AbortController
- รูปแบบการลองใหม่และการหน่วงเวลาเพิ่มขึ้น