محتويات الدورة

Vue / المتوسط: حالة الميزة وملكية الأثر / الدرس 10

البيانات غير المتزامنة والنتائج المتقادمة

نسق التحميل والإلغاء ونشر الحالة كي لا تستبدل عملية أقدم المهمة الحالية بصمت.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • نمذج التحميل والمحتوى والفشل والإبطال منفصلة.
  • استخدم التنظيف وهوية النتيجة لا تخمين التوقيت.

عرّف معنى النتيجة غير المتزامنة

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

أبطل العمل قبل قبول النتيجة

تجعل المراقبة query هوية وتسجل التنظيف قبل await للمحمّل المحقون. يمنع active نشر الملغى ويسمح AbortController بتوقف محمّل متوافق. يعتمد الإلغاء على التنفيذ ولا يعوض حارس النشر. الاستيراد عقد تطبيق لا نقطة حقيقية ولا ترسل الدورة طلباً. يتحقق المحمّل الحقيقي من البيانات ويحوّل الفشل دون تسمية الإلغاء خطأ للمستخدم.

javascript مراقبة تبطل العمل بمحمّل محقون
import { ref, watch } from "vue"
import { loadNotes } from "./notes-service.js"

const query = ref("")
const state = ref({ status: "idle", notes: [], error: null })
watch(query, async (value, _previous, onCleanup) => {
  let active = true
  const controller = new AbortController()
  onCleanup(() => { active = false; controller.abort() })
  state.value = { ...state.value, status: "loading", error: null }
  try {
    const notes = await loadNotes(value, { signal: controller.signal })
    if (active) state.value = { status: "ready", notes, error: null }
  } catch (error) {
    if (active) state.value = { ...state.value, status: "failed", error }
  }
})

يستخدم في setup مدار وعقد loadNotes متوافق. يعمل التنظيف عند الإبطال أو الإيقاف. لا يكتمل بلا الخدمة وسياق Vue ولا يدعي تنفيذ شبكة أو إطار.

احمِ الترتيب مع الإلغاء

قد تنتهي عمليتان بعكس البداية. يوفر إلغاء القراءة موارد وقد تكون اكتملت أو تجاهلت الإشارة. يحمي رمز جيل النشر مستقلاً وتشمل السياسة الحساب والمسار عند الملكية. لا يعكس إلغاء الكتابة ما قبله الخادم؛ تحتاج عقد دوام ومنع تكرار. افصل حداثة القراءة واتساق الكتابة ولا تعتبر AbortController حلاً لكل تزامن.

اختبر انتهاء معكوساً دون شبكة

يعطي المنسق الخالص رمزاً لكل مهمة ويقبل الحالي فقط. ينشر المثال الثانية قبل الأولى ويرفض الأولى، فيحاكي قرار النشر لا النقل أو Vue. يعاد بلا مؤقت أو خدمة. يتحقق التكامل منفصلاً من الهوية والتنظيف والحالة المعروضة. احفظ دليل الفشل عند التوقيت لا تكتف بإعادة ناجحة ملائمة.

javascript سياسة كاملة اصطناعية لأحدث نتيجة
function latestCoordinator() {
  let generation = 0
  let current = null
  return {
    begin: () => ++generation,
    publish(token, value) {
      if (token !== generation) return false
      current = value
      return true
    },
    read: () => current
  }
}
const coordinator = latestCoordinator()
const first = coordinator.begin()
const second = coordinator.begin()
if (!coordinator.publish(second, "new") || coordinator.publish(first, "old")) {
  throw new Error("STALE_RESULT_ACCEPTED")
}
if (coordinator.read() !== "new") throw new Error("CURRENT_RESULT_MISMATCH")

يعمل بـ Node وقيم محلية وتبقى new بعد محاولة القديم. لا يتحقق من الإلغاء أو HTTP أو عرض المكوّن.

تحقق من البيانات وأظهر الفشل القابل للتعافي

قد ينجح النقل ببيانات غير صالحة أو غير مأذونة. تحقق بالخدمة واحفظ خطأ مجال مفيداً لا حمولة خاصة. حدد هدف الإعادة ومنع التكرار وبقاء المحتوى وحداثته. اربط العمل بمالكه وراجع المراقبات خارج setup للإيقاف. تدعم 3.5 onWatcherCleanup بتسجيل متزامن؛ توضح واجهة الرد هنا العمر دون الاعتماد على ما بعد await.

الأخطاء الشائعة وإصلاحها

تستبدل نتائج قديمة بحثاً أحدث

لماذا يحدث؟
يغيب فحص هوية المهمة عند النشر.
كيف تصلحه؟
أبطل القديم واحمِ الهوية المقبولة.
كيف تتجنب تكراره؟
اختبر الترتيب المعكوس بحتمية.

يظهر الإلغاء كفشل عادي

لماذا يحدث؟
حُول الإبطال المتوقع لخطأ مستخدم.
كيف تصلحه؟
افصل القديم من خطأ النشط.
كيف تتجنب تكراره؟
ضمّن الإلغاء بعقد الحالة.

يسجل التنظيف بعد await خطأ

لماذا يحدث؟
استخدمت واجهة متزامنة خارج مرحلتها.
كيف تصلحه؟
سجل الإبطال قبل الانتظار واتبع العقد.
كيف تتجنب تكراره؟
راجع قواعد التنظيف الخاصة بالإصدار.

اختبر فهمك

1. لماذا يحفظ حارس النشر مع دعم الإلغاء؟

اعرض الحل المشروح

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

2. يلغى الحفظ بعد قبول الخادم. هل تأمن الإعادة بهوية جديدة؟

اعرض الحل المشروح

ليس تلقائياً؛ قد توجد الأولى وتكررها الجديدة. استخدم عقد الخلفية للاتساق ومنع التكرار واحفظ النتيجة المبهمة صراحة.

أهم ما تعلمته

  • تحتاج الحالة غير المتزامنة حداثة وفشلاً صريحين.
  • يكمل الإلغاء وهوية النشر بعضهما.
  • اختبر السباق بنتائج مضبوطة لا نوم.

المراجع الرسمية