0Pricing
React Academy · درس

المنطق غير المتزامن باستخدام createAsyncThunk

عالج استدعاءات API في Redux باستخدام createAsyncThunk ودورة الحياة pending/fulfilled/rejected.

المنطق غير المتزامن باستخدام createAsyncThunk درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

مرحبًا

في هذا الدرس ستتعاملون مع استدعاءات API في Redux باستخدام createAsyncThunk، ومع إجراءات دورة الحياة pending و fulfilled و rejected داخل شريحتكم.

ما هو createAsyncThunk؟

ينشئ createAsyncThunk مُنشئ إجراء thunk يرسل ثلاثة إجراءات لدورة الحياة تلقائيًا: pending (بدأ)، وfulfilled (اكتمل بنجاح)، وrejected (فشل). ويمكنكم التعامل مع كل منها في extraReducers.

تعريف Thunk

استدعوا createAsyncThunk مع سلسلة نصية للنوع ودالة async لإنشاء الحمولة. وأعيدوا البيانات التي تريدونها في حمولة fulfilled.
import { createAsyncThunk } from '@reduxjs/toolkit';

export const fetchUser = createAsyncThunk(
  'users/fetchById',
  async (userId) => {
    const response = await fetch('/api/users/' + userId);
    return response.json(); // becomes action.payload on fulfilled
  }
);

التعامل معها في extraReducers

أضيفوا حالات دورة الحياة الثلاث كلها إلى extraReducers في الشريحة. وأديروا حالات التحميل والبيانات والخطأ وفقًا لذلك.
extraReducers: (builder) => {
  builder
    .addCase(fetchUser.pending, state => {
      state.loading = true;
      state.error = null;
    })
    .addCase(fetchUser.fulfilled, (state, action) => {
      state.loading = false;
      state.user = action.payload;
    })
    .addCase(fetchUser.rejected, (state, action) => {
      state.loading = false;
      state.error = action.error.message;
    });
}

إرسال Thunk

أرسلوا thunk من مكوّن باستخدام useDispatch. ومرّروا الوسائط مباشرةً إلى مُنشئ إجراء thunk.
const dispatch = useDispatch();
useEffect(() => {
  dispatch(fetchUser(userId));
}, [userId]);

الوصول إلى الحالة داخل Thunk

تتلقى دالة إنشاء الحمولة كائنًا من النوع thunkAPI كوسيط ثانٍ لها. استخدموا thunkAPI.getState() لقراءة حالة Redux الحالية، وthunkAPI.dispatch() لإرسال إجراءات أخرى.
export const saveItem = createAsyncThunk(
  'items/save',
  async (item, { getState }) => {
    const { auth } = getState();
    return fetch('/api/items', {
      method: 'POST',
      headers: { Authorization: 'Bearer ' + auth.token },
      body: JSON.stringify(item),
    }).then(r => r.json());
  }
);

التعامل مع الأخطاء باستخدام rejectWithValue

لتمرير حمولة خطأ مخصّصة إلى حالة rejected، استخدموا thunkAPI.rejectWithValue(). وستحتوي action.payload في الإجراء المرفوض على كائن الخطأ المخصّص الخاص بكم.
export const fetchData = createAsyncThunk(
  'data/fetch',
  async (id, { rejectWithValue }) => {
    const res = await fetch('/api/' + id);
    if (!res.ok) return rejectWithValue({ status: res.status });
    return res.json();
  }
);
// In rejected case: action.payload.status is available

إلغاء Thunks

مرّروا إشارة AbortController إلى fetch داخل thunk. ويوفّر createAsyncThunk الإشارة عبر thunkAPI.signal تلقائيًا عند إلغاء thunk باستخدام dispatch.abort().
async (id, { signal }) => {
  const res = await fetch('/api/' + id, { signal });
  return res.json();
}

انتظار Thunk مُرسَل

يعيد dispatch() الخاص بـ thunk وعدًا Promise. ويمكنكم انتظار هذا الوعد لمعرفة متى يكتمل العمل غير المتزامن، وهو مفيد في أنماط إعادة التوجيه بعد الحفظ.
const result = await dispatch(saveItem(data));
if (saveItem.fulfilled.match(result)) {
  navigate('/success');
}

صيغة Builder مقابل صيغة الكائن

استخدموا نمط استدعاء builder.addCase داخل extraReducers، فهو آمن من ناحية الأنواع ومدعوم. أما الصيغة الأقدم التي تستخدم مفاتيح الكائنات فقد أُهملت في إصدارات RTK الحديثة.

تحقق سريع

ماذا يحدث عندما ترمي الدالة غير المتزامنة داخل createAsyncThunk خطأً؟

مراجعة

ينشئ createAsyncThunk إجراءات pending وfulfilled وrejected تلقائيًا. تعاملوا مع الحالات الثلاث كلها في extraReducers. واستخدموا rejectWithValue لحمولات الأخطاء المخصّصة، وthunkAPI.getState() للوصول إلى الحالة الحالية داخل thunks.

التالي

الدرس التالي: **RTK Query: نقاط النهاية والتخزين المؤقت التلقائي** — ستعرّفون نقاط نهاية API باستخدام createApi، وستتركون لـ RTK Query إدارة التخزين المؤقت تلقائيًا.

الأسئلة الشائعة

هل درس «المنطق غير المتزامن باستخدام createAsyncThunk» مجاني؟

نعم — نص درس «المنطق غير المتزامن باستخدام createAsyncThunk» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «المنطق غير المتزامن باستخدام createAsyncThunk»؟

عالج استدعاءات API في Redux باستخدام createAsyncThunk ودورة الحياة pending/fulfilled/rejected. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «المنطق غير المتزامن باستخدام createAsyncThunk»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. شرائح Redux Toolkit وcreateSlice
  2. المنطق غير المتزامن باستخدام createAsyncThunk
  3. ‏RTK Query: نقاط النهاية والتخزين المؤقت التلقائي
  4. التحديثات التفاؤلية وإبطال التخزين المؤقت
← العودة إلى React Academy