วัน: 5 มีนาคม 2012

การทำ Request Timeout และการยกเลิก Request ใน Axios ด้วย CancelToken / AbortControllerการทำ Request Timeout และการยกเลิก Request ใน Axios ด้วย CancelToken / AbortController

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


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

เมื่อพูดถึงการควบคุม Request ใน Axios เรากำลังพูดถึงกลไกที่ช่วยให้เราสามารถกำหนดขีดจำกัดเวลา (Timeout) และความสามารถในการยกเลิก (Cancellation) การทำ Timeout ช่วยป้องกันไม่ให้โค้ดของเราติดอยู่ในสถานะรอคำตอบจากเซิร์ฟเวอร์นานเกินไป ส่วน Cancellation คือการส่งสัญญาณไปยัง Request ที่กำลังทำงานอยู่ว่า “หยุดเดี๋ยวนี้” ซึ่งเป็นสิ่งสำคัญมากเมื่อผู้ใช้มีการกระทำที่ทำให้ Request เก่ากลายเป็นโมฆะ เช่น การพิมพ์ค้นหาครั้งใหม่

ในอดีต Axios ใช้ `CancelToken` เป็นวิธีหลักในการยกเลิก แต่ด้วยการพัฒนาของ Web API มาตรฐาน ทำให้ปัจจุบันเราควรหันมาใช้ `AbortController` ซึ่งเป็นมาตรฐานที่ทันสมัยกว่าและสามารถนำไปใช้กับ Fetch API และไลบรารีอื่น ๆ ได้อย่างสม่ำเสมอ การเข้าใจความแตกต่างและการเลือกใช้วิธีที่เหมาะสมจึงเป็นทักษะสำคัญสำหรับ Senior Developer

// ตัวอย่างการใช้ AbortController ใน Axios (วิธีแนะนำ)
const controller = new AbortController();
const signal = controller.signal;

axios.get('https://api.example.com/data', { 
    signal: signal, // ส่งสัญญาณไปยัง Request
    timeout: 5000 // กำหนด Timeout 5 วินาที
})
.then(response => {
    console.log("Success:", response.data);
})
.catch(error => {
    if (axios.isCancel(error) || error.name === 'AbortError') {
        // กรณีที่ถูกยกเลิกด้วยมือ หรือ Timeout
        console.error('Request was cancelled or timed out:', error.message);
    } else {
        // กรณี Error อื่นๆ เช่น 404, 500
        console.error('An unexpected error occurred:', error);
    }
});

// หากต้องการยกเลิก Request ด้วยมือ (เช่น เมื่อผู้ใช้เปลี่ยนหน้า)
// setTimeout(() => controller.abort(), 10000); // ยกเลิกหลังจาก 10 วินาที


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

  • การทำ Search Suggestions (Autocomplete):
  • การจัดการ State ในแอปพลิเคชันขนาดใหญ่:

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


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