React Native / ملكية العمل غير المتزامن والبيانات / الدرس 8
النتائج غير المتزامنة والأخطاء والحداثة
ارفض الاكتمالات المتقادمة في كل مسار نشر، وميّز التنظيف من إلغاء النقل الفعلي.
في هذه الصفحة
أهداف الدرس
- قد يختلف ترتيب الاكتمال عن ترتيب المدخلات
- احم النجاح والفشل الخاصين بنسخة التأثير
- نمذج الملكية مستقلة عن جدولة React
قد يختلف ترتيب الاكتمال عن ترتيب المدخلات
قد يبدأ بحث Maps قبل بحث Rivers وينتهي بعده. ولا يحق للنجاح أو الفشل تلقائيا استبدال الواجهة الحالية. حدّد السياسة: ينشر البحث المباشر عادة نتيجة المدخل الحالي فقط، بينما قد يحتاج حفظ معاملي إلى تسوية بدلا من استبدال صامت. لا يجمد await تنقل المستخدم أو حالة الحساب. احفظ الاستعلام والجلسة اللذين بدآ العملية، ثم افحص الملكية عند النشر. لا يثبت بقاء المكوّن معروضا أن الرد القديم يخص مدخله الحالي أو مستخدمه الحالي.
احم النجاح والفشل الخاصين بنسخة التأثير
تمنح الوحدة الأولى كل إعداد تأثير حق نشر نشطا. يسحب التنظيف الحق قبل الاستبدال أو إزالة المكوّن، فيُتجاهل النجاح والخطأ اللاحقان معا. المستودع والاستعلام اعتمادان، ويجب استقرار هويتيهما عندما لا تتغير العلاقة. ويحوّل Promise.resolve().then رمي المستودع المتزامن إلى مسار الفشل نفسه. لا تلغي البوابة العمل الأساسي أو تضمن توقف طلب HTTP. إنها سياسة مالك توضيحية تحتاج بيئة React Native متوافقة ومستودعا محقونا؛ ولا تُقدم أو تُتصل وجهة حقيقية.
import {useEffect, useState} from 'react';
import {Text} from 'react-native';
export default function SearchResult({query, repository}) {
const [state, setState] = useState({phase: 'loading'});
useEffect(() => {
let active = true;
setState({phase: 'loading'});
Promise.resolve().then(() => repository.search(query)).then(
items => { if (active) setState({phase: 'ready', items}); },
() => { if (active) setState({phase: 'failed'}); },
);
return () => { active = false; };
}, [query, repository]);
if (state.phase === 'loading') return <Text>Loading</Text>;
if (state.phase === 'failed') return <Text>Search failed</Text>;
return <Text>{state.items.join(', ') || 'No matches'}</Text>;
}
Only the currently active Effect may publish Loading, Search failed, or its accepted results.
يفترض المثال أن نتائج المستودع مصفوفات نصوص متحقق منها مسبقا. يسحب التنظيف حق النشر، ولا يدّعي إلغاء النقل.
نمذج الملكية مستقلة عن جدولة React
يمثل البرنامج الثاني هوية الطلب بتذكرة تزداد رتيبا. تكتمل B قبل A ويُرفض نشر A المتأخر. ويمر كائن نتيجة عبر البوابة نفسها لمعالجة الأخطاء والنجاح معا. يختبر النموذج المحدد السياسة دون مؤقتات أو جدولة React أو شبكة. ويحتاج تبديل الجلسة بعد هوية آخر أو حدث إبطال كي لا تنشر بيانات الحساب السابق في التالي. احفظ الجيل لدى مالك العملية، لا في متغير عام تشترك فيه شاشات غير مرتبطة.
let generation = 0;
let visible = null;
function begin() { return ++generation; }
function publish(ticket, result) {
if (ticket === generation) visible = result;
}
const a = begin();
const b = begin();
publish(b, {phase: 'ready', title: 'Rivers'});
publish(a, {phase: 'failed'});
console.log(JSON.stringify(visible));
{"phase":"ready","title":"Rivers"}
لا يستطيع الفشل القديم تغطية النجاح الأحدث. يثبت النموذج قاعدة اعتماد، لا إلغاء طلب فعليا أو تفويضا.
افصل الانتظار والنجاح الفارغ والفشل
تختلف النتيجة الفارغة الناجحة عن الطلب المرفوض. لا تلتقط كل فشل وتعيد قائمة فارغة، لأن ذلك يخفي مشكلات الخدمة كغياب نتائج. قرّر هل يحفظ التحديث البيانات المفيدة السابقة أم يستبدلها بشاشة تحميل، وحدّد العملية المخولة بمحو حالة الانتظار. قد يمحو رد finally متقادم علم انشغال عملية أحدث بصورة خاطئة. تحد المهلة الانتظار، لكنها قد لا توقف العمل الأساسي. وفي الكتابات غير المؤكدة قد يأتي فقد الرد بعد قبول الخادم؛ فاستخدم هوية العملية وسياسة تسوية الخدمة بدلا من الإعادة العمياء.
تحكم بترتيب الاكتمال في الاختبارات
استخدم مستودعا مزيفا يمكن حسم ردوده المعلقة بترتيب تختاره. ابدأ A وB، وأكمل B ثم A؛ وكرر بفشل A وانتهاء الملكية قبل الاكتمال. أكّد عجز العمل المتقادم عن تغيير النتيجة أو حالة الانتظار الحالية. أضف تغير الحساب قبل الرد إذا كان النموذج محددا بالجلسة. قد ينجح النوم الاعتباطي دون ممارسة الترتيب الخطير. تفحص نماذج Node وحدها منطق النشر، بينما يفحص عارض مجهز استبدال التأثير وسلوك الواجهة الأصلية مستقلا. لا يُنفذ هنا طلب أو عارض أو إلغاء نقل أو جهاز.
الأخطاء الشائعة وإصلاحها
تغطية فشل قديم لنتائج حديثة
- لماذا يحدث؟
- فحص الاكتمال الناجح وحده الحداثة.
- كيف تصلحه؟
- طبّق الملكية على النجاح والخطأ وتنظيف الانتظار.
- كيف تتجنب تكراره؟
- أكمل الطلب القديم بنجاح وبفشل.
إعادة بدء التأثير مع كل عرض للأب
- لماذا يحدث؟
- تتغير هوية المستودع المحقون دون حاجة.
- كيف تصلحه؟
- ثبّت مالك الاعتماد المقصود أو استبدله عمدا.
- كيف تتجنب تكراره؟
- أعد العرض دون تغيير معنى الاستعلام أو المستودع.
الإبلاغ عن انتهاء مهلة كتراجع من الخادم
- لماذا يحدث؟
- اختلط الانتظار المحلي بنتيجة المعاملة البعيدة.
- كيف تصلحه؟
- مثّل الاكتمال غير المؤكد وسوّه بعقد الخدمة.
- كيف تتجنب تكراره؟
- اختبر فقد الرد مستقلا عن الرفض الصريح.
اختبر فهمك
1. لماذا يرفض النموذج فشل A بعد نجاح B؟
اعرض الحل المشروح
يرفع بدء B الجيل الحالي. لم تعد تذكرة A تطابق ذلك المالك، بصرف النظر عن كون اكتمالها نجاحا أو فشلا. تمنع البوابة العمل المتقادم من تغيير النتيجة الحالية؛ ولا تتظاهر بأن A توقفت عن التنفيذ.
2. هل يكفي عمر المكوّن وحده أثناء تبديل الحساب؟
اعرض الحل المشروح
لا. قد يبقى المكوّن نفسه أو النموذج المشترك بينما تتغير ملكية الحساب. التقط هوية الجلسة وأبطل حقوق النشر القديمة والمخازن الخاصة. تفويض الخادم حد آخر يجب أن يتحقق من العملية الحالية؛ ولا يستطيع فحص جيل محلي أن يحل محله.
أهم ما تعلمته
- قد يختلف ترتيب الاكتمال عن ترتيب المدخلات
- تحكم بترتيب الاكتمال في الاختبارات