React Academy · บทเรียน

การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล

จัดการการตัดการเชื่อมต่ออย่างเหมาะสม และล้างตัวรับฟังซ็อกเก็ตใน useEffect

บทเรียน 4 จาก 413 ขั้นตอน

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

เหตุใดการเชื่อมต่อใหม่จึงสำคัญ

การหยุดชะงักของเครือข่ายเกิดขึ้นบ่อยบนอุปกรณ์มือถือ หากไม่มีตรรกะการเชื่อมต่อใหม่ ผู้ใช้จะสูญเสียการเชื่อมต่อแบบเรียลไทม์โดยไม่รู้ตัว กลยุทธ์ที่ดีคือการลองใหม่โดยอัตโนมัติพร้อมเพิ่มเวลาหน่วง

การเชื่อมต่อใหม่อัตโนมัติของ Socket.IO

Socket.IO จะเชื่อมต่อใหม่โดยอัตโนมัติตามค่าเริ่มต้น กำหนดค่า reconnectionAttempts, reconnectionDelay และ reconnectionDelayMax ในตัวเลือกของ io()

const socket = io('https://api.example.com', {
  reconnectionAttempts: 5,
  reconnectionDelay: 1000,       // initial delay
  reconnectionDelayMax: 10000,   // max delay (exponential backoff)
  randomizationFactor: 0.5,
});

การติดตามสถานะการเชื่อมต่อใน React

รับฟังเหตุการณ์ connect, disconnect และ connect_error แล้วสะท้อนสถานะในสถานะของคอมโพเนนต์

function useConnectionStatus() {
  const [status, setStatus] = useState<'connected' | 'disconnected' | 'error'>(
    socket.connected ? 'connected' : 'disconnected'
  );

  useEffect(() => {
    socket.on('connect', () => setStatus('connected'));
    socket.on('disconnect', () => setStatus('disconnected'));
    socket.on('connect_error', () => setStatus('error'));
    return () => {
      socket.off('connect');
      socket.off('disconnect');
      socket.off('connect_error');
    };
  }, []);

  return status;
}

การแสดงแบนเนอร์การเชื่อมต่อใหม่

แสดงแบนเนอร์เมื่อซ็อกเก็ตยกเลิกการเชื่อมต่อ เพื่อให้ผู้ใช้ทราบว่าขณะนี้ออฟไลน์และกำลังเชื่อมต่อใหม่

function ConnectionBanner() {
  const status = useConnectionStatus();
  if (status === 'connected') return null;
  return (
    <div className="banner warning">
      {status === 'error' ? 'Connection failed' : 'Reconnecting...'}
    </div>
  );
}

การเชื่อมต่อใหม่ด้วยตนเอง

หลังจากลองใหม่ครบจำนวนแล้ว ให้ผู้ใช้เริ่มการเชื่อมต่อใหม่ด้วยตนเองผ่านปุ่ม

const [failed, setFailed] = useState(false);

socket.on('reconnect_failed', () => setFailed(true));

if (failed) {
  return (
    <button onClick={() => { setFailed(false); socket.connect(); }}>
      Retry connection
    </button>
  );
}

การเชื่อมต่อใหม่ของ WebSocket โดยตรง

WebSocket โดยตรงไม่มีการเชื่อมต่อใหม่ในตัว ให้สร้างการเพิ่มเวลาหน่วงแบบทวีคูณด้วยตนเอง: เมื่อปิดการเชื่อมต่อ ให้รอ Math.min(delay * 2, maxDelay) ก่อนพยายามเชื่อมต่อใหม่

function connectWithBackoff(url, attempt = 0) {
  const ws = new WebSocket(url);
  ws.onclose = () => {
    const delay = Math.min(1000 * 2 ** attempt, 30000);
    setTimeout(() => connectWithBackoff(url, attempt + 1), delay);
  };
  return ws;
}

การล้างข้อมูลใน useEffect

ตัวรับฟังซ็อกเก็ตทุกตัวที่เพิ่มใน useEffect ต้องถูกลบออกในฟังก์ชันล้างข้อมูล หากไม่ทำเช่นนั้นจะทำให้หน่วยความจำรั่วและจัดการเหตุการณ์ซ้ำ

useEffect(() => {
  const onData = (d) => setState(d);
  socket.on('data', onData);

  return () => {
    socket.off('data', onData); // remove specific handler reference
  };
}, []);

การหลีกเลี่ยงโคลเชอร์ที่ล้าสมัยในตัวจัดการ

เมื่อตัวจัดการซ็อกเก็ตอ้างอิงสถานะหรือพร็อพ ตัวจัดการนั้นจะเก็บโคลเชอร์ที่ล้าสมัยไว้ ใช้รีฟเพื่อเข้าถึงค่าล่าสุดได้เสมอ

const handlerRef = useRef(null);
handlerRef.current = (msg) => updateMessages(messages, msg); // fresh ref each render

useEffect(() => {
  const onMsg = (...args) => handlerRef.current(...args);
  socket.on('message', onMsg);
  return () => socket.off('message', onMsg);
}, []); // no deps needed

การส่งข้อความที่รออยู่เมื่อเชื่อมต่อใหม่

เข้าคิวข้อความขาออกขณะยกเลิกการเชื่อมต่อ และส่งข้อความในคิวออกเมื่อสร้างการเชื่อมต่อใหม่สำเร็จ

const queue = useRef<string[]>([]);

socket.on('connect', () => {
  while (queue.current.length) {
    socket.emit('message', queue.current.shift());
  }
});

function send(text: string) {
  if (socket.connected) socket.emit('message', text);
  else queue.current.push(text);
}

การเข้าร่วมห้องอีกครั้งหลังเชื่อมต่อใหม่

Socket.IO จะล้างการเป็นสมาชิกห้องเมื่อยกเลิกการเชื่อมต่อ ให้เข้าร่วมห้องอีกครั้งเมื่อซ็อกเก็ตเชื่อมต่อใหม่ เพื่อคืนค่าการสมัครรับข้อมูล

useEffect(() => {
  function rejoin() { socket.emit('join-room', roomId); }
  socket.on('connect', rejoin);
  return () => socket.off('connect', rejoin);
}, [roomId]);

การจัดการข้อผิดพลาดทั่วทั้งระบบ

จัดการข้อผิดพลาดที่กู้คืนไม่ได้อย่างเหมาะสม โดยแสดงส่วนติดต่อผู้ใช้ข้อผิดพลาดและเสนอให้โหลดหน้าใหม่เป็นทางเลือกสุดท้าย

socket.on('connect_error', (err) => {
  console.error('Socket error:', err.message);
  // Show user-friendly error
});

ตรวจสอบอย่างรวดเร็ว

ความเสี่ยงของการไม่ลบตัวรับฟังเหตุการณ์ของซ็อกเก็ตในการล้างข้อมูลของ useEffect คืออะไร

สรุปทบทวน

กำหนดค่าการเชื่อมต่อใหม่ของ Socket.IO ด้วยตัวเลือกการเพิ่มเวลาหน่วง สะท้อนสถานะการเชื่อมต่อในสถานะของ React แสดงแบนเนอร์การเชื่อมต่อใหม่ เข้าร่วมห้องอีกครั้งหลังเชื่อมต่อใหม่ และลบตัวรับฟังในการล้างข้อมูลของ useEffect เสมอ เข้าคิวข้อความที่รออยู่ขณะออฟไลน์และส่งออกเมื่อเชื่อมต่อใหม่

เริ่มต้นได้ฟรี

เรียนรู้ React ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
88
บทเรียน
324

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

บทเรียน “การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล”

จัดการการตัดการเชื่อมต่ออย่างเหมาะสม และล้างตัวรับฟังซ็อกเก็ตใน useEffect คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. พื้นฐาน WebSocket ในเบราว์เซอร์
  2. การใช้ Socket.IO กับ React
  3. การสร้างคอมโพเนนต์แชตแบบเรียลไทม์
  4. การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล
← กลับไปที่ React Academy