إعادة الاتصال ومعالجة الأخطاء والتنظيف
عالج انقطاعات الاتصال بسلاسة ونظّف مستمعي socket داخل useEffect.
إعادة الاتصال ومعالجة الأخطاء والتنظيف درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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. ضعوا الرسائل المعلّقة في قائمة انتظار أثناء عدم الاتصال، ثم أفرغوا القائمة عند إعادة الاتصال.
الأسئلة الشائعة
هل درس «إعادة الاتصال ومعالجة الأخطاء والتنظيف» مجاني؟
نعم — نص درس «إعادة الاتصال ومعالجة الأخطاء والتنظيف» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «إعادة الاتصال ومعالجة الأخطاء والتنظيف»؟
عالج انقطاعات الاتصال بسلاسة ونظّف مستمعي socket داخل useEffect. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «إعادة الاتصال ومعالجة الأخطاء والتنظيف»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات WebSocket في المتصفح
- استخدام Socket.IO مع React
- إنشاء مكوّن دردشة فورية
- إعادة الاتصال ومعالجة الأخطاء والتنظيف