การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล
จัดการการตัดการเชื่อมต่ออย่างเหมาะสม และล้างตัวรับฟังซ็อกเก็ตใน useEffect
การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน WebSocket ในเบราว์เซอร์
- การใช้ Socket.IO กับ React
- การสร้างคอมโพเนนต์แชตแบบเรียลไทม์
- การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล