JavaScript / متقدم: الجدولة والواجهات الموثوقة / الدرس 14
حدود التزامن وملكية النتائج
نسّق العمليات المتداخلة دون افتراض أن الوعود توفر التوازي أو الإلغاء. استخدم الأجيال والبيانات المنقولة لفهم النتائج القديمة وحدود العمال.
في هذه الصفحة
أهداف الدرس
- منع العمليات القديمة من تحديث الحالة الحالية.
- فصل الإلغاء من قبول النتيجة.
- شرح رسائل العمال والنسخ ونقل الملكية.
قد تتسابق الاستدعاءات منطقياً رغم خيط واحد
قد يتداخل بحثان وتعمل دوالهما واحدة كل مرة. إذا انتهى الأقدم أخيراً فقد يستبدل النتيجة الحديثة. هذا سباق منطقي عبر حدود غير متزامنة لا كتابة متوازية بالضرورة. حدّد قاعدة المنتج: يفوز أحدث استعلام أو تهم كل عملية أو تدمج النتائج بمعرفات. يناسب عداد الجيل عرض الأحدث ولا يناسب عمليات مالية مستقلة يجب حسابها كلها. اختر التنسيق من المجال لا نمط إلغاء عام.
قبول نتائج الجيل الحالي فقط
زد الجيل عند بدء بحث والتقطه في المتابعة. قبل عرض النجاح أو الخطأ أو التنظيف تحقق من ملكيته للطلب النشط. يحل المثال الحديث ثم القديم بلا مؤقت أو شبكة، فلا يقبل إلا new. حماية النجاح وحده ناقصة؛ فقد يستبدل رفض قديم الرسالة أو تمحو finally قديمة تحميل الجديد. اختبر المسارات الثلاثة بترتيب معكوس وبعد تحرير العرض.
let generation = 0;
const shown = [];
function start(promise) {
const own = ++generation;
return promise.then(value => { if (own === generation) shown.push(value); });
}
let resolveOld, resolveNew;
const oldWork = start(new Promise(resolve => { resolveOld = resolve; }));
const newWork = start(new Promise(resolve => { resolveNew = resolve; }));
resolveNew("new");
await newWork;
resolveOld("old");
await oldWork;
console.log(shown.join(","));
new
تنتهي العمليتان لكن الجيل الحالي وحده يعدّل سجل العرض.
الإلغاء عقد عملية تعاوني
توفر AbortController إشارة لواجهات داعمة مثل fetch والمستمعين. يطلب abort سلوك الواجهة ولا يعكس أثراً خارجياً اعتمد أو يلغي كل وعد مشتق. احتفظ بحارس النتيجة عند الحاجة وميّز إلغاء المستخدم من الإخفاق مع تحرير الموارد. للكتابة تبقى عدم مضاعفة الأثر والمعاملة حماية منفصلة. لا يثبت إلغاء المتصفح أن الخادم لم يستقبل الطلب أو يكمله؛ فلا تعتبر دفعاً غير موجود لأن الانتظار المحلي توقف.
يغير حد العامل ملكية البيانات
يعمل عامل الويب في بيئة تنفيذ منفصلة ولا يعدل DOM الصفحة مباشرة. تواصل برسائل ذات معرف طلب ومخطط ونتيجة أو خطأ. تنسخ البيانات وفق قواعد النسخ البنيوي، وقد تنقل الكائنات القابلة للنقل الملكية. يفصل نقل ArrayBuffer المخزن عن المرسل فتخالف قراءته اللاحقة افتراضه. يوضح المثال النقل محلياً بلا عامل أو تحميل برنامج. وتظل كلفة البيانات وعرض النتيجة مهمة رغم خروج الحساب من الخيط الرئيسي.
const input = new Uint8Array([7, 9]);
const output = structuredClone(input, { transfer: [input.buffer] });
console.log(input.buffer.byteLength);
console.log(output.join(","));
0
7,9
ينفصل مخزن المرسل وتحتفظ الرؤية الجديدة بالقيم. يفحص المثال النقل لا جدولة العامل.
تحديد العمل ومعنى الاكتمال
ينبغي أن يرفض البروتوكول الرسائل المجهولة ويربط النتائج بالعرض ويحدد الإنهاء. لا ترسل الدوال أو عقد DOM بافتراض أنها بيانات محمولة. حدّ الطابور وحجم البيانات؛ فقد يستنفد العامل الذاكرة. تدخل SharedArrayBuffer تنسيق ذاكرة مشتركة ومتطلبات أمنية تتجاوز النسخ، فلا تعد تحسيناً تلقائياً. فضّل الرسائل والنتائج الثابتة حين تكفي، واختبر الإلغاء والتأخر والتشوه وفشل العامل محلياً قبل الاعتمادات وادعاءات الإنتاجية.
الأخطاء الشائعة وإصلاحها
استبدال بحث قديم لاستعلام حديث
- لماذا يحدث؟
- الخلط بين ترتيب الاكتمال وقصد المستخدم.
- كيف تصلحه؟
- استخدام هوية الطلب وحماية النجاح والخطأ والتنظيف.
- كيف تتجنب تكراره؟
- اختبار الاكتمال المعكوس والتحرير.
اعتبار الإلغاء تراجعاً عن الكتابة
- لماذا يحدث؟
- الخلط بين الإلغاء المحلي ومعاملة الخادم.
- كيف تصلحه؟
- مطابقة هوية العملية وحماية التكرار في الخادم.
- كيف تتجنب تكراره؟
- توثيق الاكتمال الغامض صراحة.
إعادة استخدام المرسل مخزناً منقولاً
- لماذا يحدث؟
- الخلط بين النقل والنسخ العادي.
- كيف تصلحه؟
- إيقاف استخدام المخزن المنفصل أو اختيار النسخ.
- كيف تتجنب تكراره؟
- تحديد ملكية البيانات في عقد الرسالة.
اختبر فهمك
1. لماذا تحمى finally في مسار أحدث بحث؟
اعرض الحل المشروح
قد ينتهي القديم بعد بدء الحديث ويمحو انشغاله. يجب أن يتحقق التنظيف من الجيل المالك، وكذلك الخطأ والنجاح حتى لا يستبدل مسار قديم الواجهة الحالية.
2. يحتاج عامل مخزناً كبيراً ولن يعيد المستدعي استخدامه. ما الاختيار الملائم؟
اعرض الحل المشروح
قد ينقل النقل المدعوم المخزن بدلاً من نسخ محتواه، ويعتبر المرسل الأصل منفصلاً. افحص البيانات والعمر وقس الكلفة الكاملة. لا يناسب النقل احتياج المرسل للمخزن نفسه.
أهم ما تعلمته
- تحتاج النتائج المتداخلة قواعد قبول وملكية حسب المجال.
- تحل الوعود وإشارات الإلغاء والعمال مشكلات مختلفة.