ป้ายกำกับ: Pure Js

ทำความรู้จัก XMLHttpRequest (XHR) ใน Pure JS: เมื่อไหร่ที่ยังจำเป็นต้องใช้แทน Fetch APIทำความรู้จัก XMLHttpRequest (XHR) ใน Pure JS: เมื่อไหร่ที่ยังจำเป็นต้องใช้แทน Fetch API

ในโลกของการพัฒนาเว็บแอปพลิเคชันที่ทันสมัย การโต้ตอบกับข้อมูลภายนอกอย่างรวดเร็วและราบรื่นโดยไม่ทำให้ UI ค้าง (Non-blocking UI) คือหัวใจสำคัญของการสร้างประสบการณ์ผู้ใช้ที่ดีเยี่ยม แนวคิดพื้นฐานนี้คือการสื่อสารแบบ Asynchronous ซึ่งช่วยให้ JavaScript สามารถส่งคำขอไปยังเซิร์ฟเวอร์เพื่อดึงหรือส่งข้อมูลในเบื้องหลังได้อย่างมีประสิทธิภาพ

XMLHttpRequest (XHR) และ Fetch API: การเปรียบเทียบเชิงสถาปัตยกรรม

เมื่อพูดถึงการสื่อสารแบบ Asynchronous ใน JavaScript เรามักจะนึกถึง XMLHttpRequest (XHR) ซึ่งเป็น API ดั้งเดิมที่ทำงานบน Event-driven Model ทำให้เราสามารถควบคุมสถานะของคำขอ (State Management) ได้อย่างละเอียด ในขณะที่ Fetch API เข้ามาแทนที่ด้วยการใช้ Promises และ `async/await` ทำให้โค้ดดูสะอาดตาและจัดการ Flow ได้ง่ายขึ้น

แม้ว่า Fetch API จะเป็นตัวเลือกที่แนะนำสำหรับโปรเจกต์ส่วนใหญ่ แต่ XHR ยังคงมีบทบาทสำคัญในสถานการณ์ที่ต้องการการควบคุมสถานะ (State) อย่างละเอียด หรือเมื่อต้องจัดการกับ Event-driven Logic ที่ซับซ้อน ซึ่งการใช้ Callback ของ XHR ทำได้โดยตรงกว่า

สถานการณ์ที่ XHR ยังคงโดดเด่นกว่า

ในมุมมองของ Senior Architect การเลือกใช้ API ไม่ได้ขึ้นอยู่กับความทันสมัยเพียงอย่างเดียว แต่ขึ้นอยู่กับความต้องการในการควบคุมระบบ (System Control) หากแอปพลิเคชันของคุณต้องจัดการกับสถานะของคำขอ (Request State) แบบเป็นขั้นตอน (Step-by-step) หรือต้องเข้าถึง Event ต่างๆ ของการเชื่อมต่ออย่างละเอียด XHR จะมอบความยืดหยุ่นระดับต่ำ (Low-level control) ที่ Fetch API ไม่ได้ให้มา

เพื่อสาธิตแนวคิดการจัดการสถานะแบบเป็นขั้นตอน (Stateful Transaction) เราสามารถจำลองการทำงานนี้ได้ด้วย PostgreSQL โดยใช้ฟังก์ชันที่ต้องมีการตรวจสอบสถานะย่อยๆ ในแต่ละขั้นตอน:

SQL

-- ตัวอย่างการจำลอง State Management แบบ XHR-like ใน PostgreSQL
CREATE OR REPLACE FUNCTION process_data_async(input_data text) RETURNS TABLE (step text, status text) AS $$
BEGIN
    RETURN QUERY SELECT 'INIT', 'OPEN' WHERE input_data = '1,2,3';
    PERFORM pg_sleep(0.1);
    RETURN QUERY SELECT 'SEND', 'SENT' WHERE input_data = '1,2,3';
    PERFORM pg_sleep(0.1);
    RETURN QUERY SELECT 'COMPLETE', 'SUCCESS' WHERE input_data = '1,2,3';
END;
$$ LANGUAGE plpgsql;

SELECT * FROM process_data_async('1,2,3');

ในทางกลับกัน หากเราใช้แนวทางที่ทันสมัยกว่า (เทียบเท่า Fetch API) เราจะเน้นการทำ Transaction ที่จบในครั้งเดียว ซึ่งมีโครงสร้างที่เรียบง่ายกว่า:

SQL

-- ตัวอย่างการทำ Transaction แบบ Fetch-like (Atomic Operation)
BEGIN;
    INSERT INTO logs (data_list) VALUES ('apple,banana,orange');
    UPDATE metrics SET count = count + 1 WHERE id = 1;
COMMIT;

บทสรุป: การเลือกใช้ API ที่เหมาะสม

โดยสรุปแล้ว สำหรับการพัฒนาเว็บแอปพลิเคชันส่วนใหญ่ Fetch API คือตัวเลือกที่สะอาดและทันสมัยที่สุด แต่ในฐานะ System Specialist เราต้องทราบว่า XHR ยังคงเป็นเครื่องมือที่ทรงพลังเมื่อเราต้องการการควบคุม Event และ State Management ในระดับที่ละเอียดอ่อนกว่าการจัดการ Promise ทั่วไป การทำความเข้าใจทั้งสอง API จึงเป็นสิ่งจำเป็นสำหรับนักพัฒนาที่ต้องการสร้างระบบที่มีความเสถียรและประสิทธิภาพสูงสุด