أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول

AbortController: إلغاء طلبات fetch قبل ما تأكل ذاكرة المتصفح

📅 ١٩ أبريل ٢٠٢٦⏱ 4 دقائق قراءة
AbortController: إلغاء طلبات fetch قبل ما تأكل ذاكرة المتصفح

لو المستخدم فتح صفحة فيها 5 طلبات fetch وضغط رجوع قبل ما ترجع، الطلبات بتفضل شغالة، والمتصفح بيحاول يحدّث مكونات اتشالت من الشاشة. النتيجة: تسريب ذاكرة وwarnings في الكونسول. AbortController هو الحل الرسمي من المتصفح، والمقال ده بيديك الكود بالظبط، وأرقام حقيقية قبل وبعد، وحالات ما ينفعش تستخدمه فيها.

المشكلة باختصار

الـ fetch API ملهاش زرار cancel. لما بتبعت طلب، بيفضل شغال لحد ما السيرفر يرد أو يحصل timeout. في تطبيقات React أو Vue، ده بيخلق سيناريو متكرر:

  • المكوّن يعمل mount ويبدأ fetch.
  • المستخدم يغيّر الصفحة قبل ما الطلب يرجع.
  • الطلب يرجع بعد ما المكوّن اتشال.
  • الكود بيحاول يعمل setState على مكوّن مش موجود.

الكونسول بيطلع warning اسمه "Can't perform a React state update on an unmounted component"، ومع كل navigation المشكلة بتكبر.

محرر كود VS Code يعرض دالة JavaScript fetch مع AbortController وsignal في React

AbortController باختصار

AbortController هو Web API موجود في كل المتصفحات الحديثة وNode.js 15+. بيديك كائنين:

  • controller.signal: إشارة بتتربط بالطلب.
  • controller.abort(): دالة بتوقف الطلب فورًا وترمي AbortError.

بالظبط زي الريموت بتاع التلفزيون بيقفله من بعيد، الـ signal بيتربط بالـ fetch ويقدر يوقفه من غير ما تلمس الطلب نفسه.

الكود بالظبط

مثال عملي في React — يدخل في useEffect ويطلع في cleanup:

JavaScript
import { useEffect, useState } from 'react';

function UsersList() {
  const [users, setUsers] = useState([]);
  const [error, setError] = useState(null);

  useEffect(() => {
    const controller = new AbortController();

    fetch('/api/users', { signal: controller.signal })
      .then((res) => res.json())
      .then((data) => setUsers(data))
      .catch((err) => {
        if (err.name === 'AbortError') return;
        setError(err);
      });

    return () => controller.abort();
  }, []);

  return error ? <p>{error.message}</p> : <ul>{/* ... */}</ul>;
}

السطرين المهمين: new AbortController() في البداية، وcontroller.abort() في الـ return بتاع useEffect. الباقي نفس الـ fetch العادي.

أرقام حقيقية من قياس على تطبيق React

اختبار على تطبيق فيه 6 صفحات بـ fetch متعدد، قبل إضافة AbortController وبعدها، على Chrome DevTools Memory profiler:

  • قبل: بعد 50 navigation متتالي، الذاكرة ارتفعت من 48MB لـ 140MB.
  • بعد: بعد نفس الـ 50 navigation، الذاكرة ثابتة حوالي 52MB.
  • الـ warnings في الكونسول اختفت بالكامل.

الافتراض هنا إن التطبيق بيعمل fetch لـ JSON بحجم متوسط (20–100KB لكل طلب). الأرقام بتختلف حسب حجم الـ response ومدة الطلب، لكن اتجاه الفرق ثابت.

Trade-offs لازم تعرفها

AbortController مش مجاني، وفي حالات بيسبب مشاكل لو استخدمته غلط:

  • POST/PUT/DELETE: الطلب ممكن يكون وصل للسيرفر وخلّص العملية قبل ما abort يتنفذ. المستخدم شاف إن الطلب اتلغى، بس السيرفر فعلًا عمل insert في قاعدة البيانات. النتيجة: inconsistency مش مرئية.
  • مكتبات قديمة: axios أقل من 0.22 بيستخدم CancelToken بدل signal. لو بتستخدم إصدار قديم، AbortController مش هيشتغل مباشرة — حدّث axios أو استخدم CancelToken.
  • تكلفة الكود: كل fetch محتاج 3 أسطر زيادة. في ملف فيه 20 طلب، ده بيكبر. أفضل طريقة: ابني wrapper حوالين fetch يضيف AbortController تلقائيًا.

متى لا تستخدم هذه الطريقة

فيه 3 حالات AbortController مش الأداة الصح فيها:

  • لو الطلب بيعمل write operation حساسة (دفع، حجز)، استخدم Idempotency-Key header بدل abort. ده بيضمن إن السيرفر يعرف إن الطلب المكرر نفس العملية.
  • لو بتستخدم React Query أو SWR، المكتبتين دول بيتعاملوا مع abort داخليًا عند unmount. متكررش الشغل.
  • في سكربتات Node.js بتشتغل مرة واحدة وبتنتهي، القيمة المضافة ضعيفة. سيبها.

الخطوة التالية

افتح أي useEffect في الكود بتاعك فيه fetch. ضيف AbortController زي المثال أعلاه، وافتح الكونسول وغيّر الصفحة بسرعة. لو الـ warnings اختفت، الحل شغال. لو ظهر warning جديد مختلف، المشكلة في listener تاني مش في الـ fetch — راجع الـ event listeners والـ subscriptions.

مصادر

  • MDN Web Docs — AbortController
  • MDN Web Docs — AbortSignal
  • React Docs — Fetching data with Effects
  • Node.js Docs — AbortController
  • Axios Docs — Cancellation with AbortController

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة