PlusMagi's Blog By Pitt Phunsanit Frontend,JavaScript,technology,Web การทำ Request Timeout และการยกเลิก Request ใน Fetch API ด้วย AbortController

การทำ Request Timeout และการยกเลิก Request ใน Fetch API ด้วย AbortController

ในโลกของการพัฒนาเว็บแอปพลิเคชันที่ต้องพึ่งพาการสื่อสารกับ API ภายนอกอย่างต่อเนื่อง ปัญหาเรื่องความล่าช้าของเครือข่าย (Network Latency) หรือการตอบสนองที่ไม่มีกำหนดเวลานั้นเป็นสิ่งที่หลีกเลี่ยงไม่ได้ การปล่อยให้โค้ดรอคำตอบจากเซิร์ฟเวอร์ไปเรื่อย ๆ โดยไม่มีกลไกควบคุม จะส่งผลเสียอย่างมากต่อประสบการณ์ผู้ใช้งาน (UX) และอาจทำให้ทรัพยากรของเบราว์เซอร์ถูกผูกไว้โดยไม่จำเป็น ดังนั้นการจัดการวงจรชีวิตของการเรียกข้อมูลจึงเป็นทักษะสำคัญที่นักพัฒนาทุกคนต้องเข้าใจ


เจาะลึกรายละเอียดและประเด็นสำคัญ

หัวใจของการจัดการ Request Timeout และการยกเลิกใน Fetch API คือการใช้ Web Standard ที่เรียกว่า AbortController ก่อนหน้านี้ การทำงานกับ Promise ของ Fetch มักจะรอจนกว่าคำขอจะสำเร็จหรือล้มเหลวด้วยเหตุผลที่ชัดเจน แต่หากเกิดความล่าช้าเกินขีดจำกัดที่เรายอมรับได้ เราจำเป็นต้องมีกลไกในการ “ยกเลิก” คำขอนั้นอย่างสง่างาม (Graceful Cancellation) เพื่อป้องกันการค้างของ UI และทรัพยากร

AbortController ทำหน้าที่เป็นตัวควบคุมสัญญาณ (Signal) ที่สามารถส่งคำสั่งยกเลิกไปยัง Promise หรือ API Call อื่น ๆ ได้อย่างแม่นยำ เมื่อเราสร้าง AbortController ขึ้นมา เราจะได้ทั้ง controller และ signal ซึ่ง signal นี้เองที่เราต้องส่งเข้าไปในอาร์กิวเมนต์ของ Fetch API เพื่อให้เบราว์เซอร์ทราบว่าคำขอนี้สามารถถูกยกเลิกได้เมื่อถึงเวลาที่กำหนด

const controller = new AbortController();
// ส่ง signal เข้าไปใน fetch()
fetch('https://api.example.com/data', { 
    signal: controller.signal 
})
.then(response => response.json())
.then(data => console.log("Success:", data))
.catch(error => {
    if (error.name === 'AbortError') {
        console.log('Request was manually aborted.');
    } else {
        console.error('Fetch error:', error);
    }
});

// ตั้งเวลาให้ยกเลิกคำขอหลังจากผ่านไป 3 วินาที
setTimeout(() => {
    controller.abort(); // นี่คือการส่งสัญญาณยกเลิก
}, 3000);


การนำไปประยุกต์ใช้ในชีวิตและการทำงานยุคใหม่

  • ระบบ Autocomplete/Search Suggestions: เมื่อผู้ใช้เริ่มพิมพ์คำค้นหา ระบบควรยกเลิก (Abort) คำขอ API เก่าทันทีที่ตรวจพบการพิมพ์ตัวอักษรใหม่ เพื่อป้องกันไม่ให้มีการประมวลผลข้อมูลเก่าและรับเฉพาะชุดข้อมูลล่าสุดเท่านั้น ทำให้ UI ตอบสนองได้รวดเร็วแม้เครือข่ายจะช้า
  • การจัดการ Form Submission ที่มี Timeout: สำหรับฟอร์มที่ต้องส่งข้อมูลขนาดใหญ่ไปยังเซิร์ฟเวอร์ เราควรตั้งค่า Timeout เพื่อให้แน่ใจว่าหากเซิร์ฟเวอร์ล่มหรือตอบสนองช้าเกินไป ผู้ใช้จะได้รับข้อความแจ้งเตือนทันที แทนที่จะเห็นเพียง Loading Spinner ที่ค้างอยู่ตลอดกาล

การทำ Request Timeout และ Cancellation ไม่ใช่แค่ฟีเจอร์ทางเทคนิค แต่คือหลักปฏิบัติที่ดีในการสร้าง User Experience (UX) ที่เหนือระดับ การควบคุมวงจรชีวิตของคำขอข้อมูลอย่างรอบคอบ ทำให้แอปพลิเคชันของเรามีความทนทาน (Resilience) และรู้สึกรวดเร็ว แม้ในสภาวะเครือข่ายที่ไม่สมบูรณ์ นี่คือสิ่งที่แยกโค้ดที่ทำงานได้ ออกจากโค้ดที่ใช้งานได้อย่างมืออาชีพ


อ่านเพิ่มเติม

Exit mobile version