0Pricing
JavaScript Academy · บทเรียน

Timeout และการยกเลิกด้วย AbortController

เพิ่ม timeout ให้โค้ด async และยกเลิกงานด้วย AbortController เชื่อมสัญญาณเข้ากับงานเพื่อหยุดได้เร็วขึ้น

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

เหตุใดจึงต้องกำหนดเวลาหมดและยกเลิก

เป้าหมาย: หยุดงานที่ใช้เวลานานอย่างปลอดภัย

  • เพิ่มการกำหนดเวลาหมดอย่างง่าย
  • ใช้ AbortController
  • เชื่อมสัญญาณเข้ากับงาน
  • เก็บกวาดตัวจับเวลา
Timeout และการยกเลิกด้วย AbortController — ภาพประกอบ 1

งานที่รับรู้สัญญาณ

สร้างงานที่ฟัง 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);
});
Timeout และการยกเลิกด้วย AbortController — ภาพประกอบ 2

การยกเลิกขณะทำงาน

สร้าง 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);
Timeout และการยกเลิกด้วย AbortController — ภาพประกอบ 3

ตัวครอบการกำหนดเวลาหมด

ใช้ 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); });
Timeout และการยกเลิกด้วย AbortController — ภาพประกอบ 4

การกำหนดเวลาหมดและการยกเลิกพร้อมกัน

หากการกำหนดเวลาหมดเกิดขึ้นก่อน ให้เรียก 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); });
Timeout และการยกเลิกด้วย AbortController — ภาพประกอบ 5

เคล็ดลับและรายการตรวจสอบ

เคล็ดลับ:

  • ล้างตัวจับเวลาในขั้นตอนสุดท้ายเสมอ
  • ส่งสัญญาณเข้าไปในงานและตรวจสอบ signal.aborted
  • ควรใช้ controller หนึ่งตัวต่อคำขอหนึ่งรายการ
Timeout และการยกเลิกด้วย AbortController — ภาพประกอบ 6

แบบทดสอบพื้นฐาน AbortController

ตรวจสอบอย่างรวดเร็ว: รูปแบบการยกเลิก

Timeout และการยกเลิกด้วย AbortController — ภาพประกอบ 7

ทบทวน

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

Timeout และการยกเลิกด้วย AbortController — ภาพประกอบ 8

คำถามที่พบบ่อย

บทเรียน “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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเขียนฟังก์ชัน async; try/catch; แบบขนานกับแบบลำดับ
  2. Timeout และการยกเลิกด้วย AbortController
  3. รูปแบบการลองใหม่และการหน่วงเวลาเพิ่มขึ้น
← กลับไปที่ JavaScript Academy