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

JavaScript / متوسط: الوحدات والعقود غير المتزامنة / الدرس 11

بروتوكولات التكرار والتسلسلات الكسولة

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

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

أهداف الدرس

  • تمييز عقد القابل للتكرار والمكرر.
  • تتبع تعليق المولد ونفاده.
  • تحديد الاستهلاك وتحرير الموارد المملوكة.

التكرار بروتوكول لا حلقة مصفوفة فقط

يوفر القابل للتكرار دالة عند Symbol.iterator تعيد مكرراً، وتعيد next كائناً للقيمة والانتهاء. تستهلك for...of البروتوكول، وتعدّد for...in مفاتيح الخصائص القابلة للتعداد وقد تشمل الموروث؛ فلا تستبدل مرور القيم. تدعم المصفوفة والنص وMap وSet التكرار، ولا يصبح السجل العادي قابلاً له تلقائياً. اختر Object.entries لأزواج المفاتيح والقيم الذاتية عند ملاءمتها، ولا تضف مكرراً لإخفاء نموذج بيانات غامض.

ينتج المولد العمل عند الطلب

ينشئ استدعاء دالة مولد مكرراً دون إكمال جسمها. تقدم next التنفيذ إلى yield التالية وتحفظ الحالة بين المتابعات. ينتج ذلك قيماً عند الحاجة بدلاً من تخصيصها كلها. يولد المثال ثلاث صفحات مصطنعة؛ تحدد قيمة return الانتهاء ولا تدخل كعنصر yielded في for...of أو النشر. يضبط الكسل وقت العمل، ولا يضمن قلة الذاكرة إذا نشر المستهلك تسلسلاً ضخماً أو غير محدود في مصفوفة.

javascript يتقدم مؤشر واحد ثم ينفد
function* pages(limit) {
  for (let page = 1; page <= limit; page++) yield page;
}
const cursor = pages(3);
console.log(cursor.next().value);
console.log(JSON.stringify([...cursor]));
console.log(cursor.next().done);
الناتج المتوقع
1
[2,3]
true

بعد الواحد يستهلك النشر الاثنين والثلاثة فقط، ولا يعيد استخدام المؤشر المنتهي المولد للبداية.

يمكن للقابل للتكرار إنشاء مؤشرات جديدة

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

للخروج المبكر عقد تنظيف

عند الخروج المبكر المناسب من for...of قد يستدعي الإغلاق return للمكرر، فيعمل finally للمولد عند break ويفيد للتنظيف. لا تخلط ذلك بانتظار تحرير موارد غير متزامنة تلقائياً؛ فعقدا التكرار مختلفان. يسجل المثال الإغلاق دون ملف أو اتصال. اختبر لمورد حقيقي الخروج والنفاد والاستثناء واربط الإعداد بالتنظيف. وقد يحتاج مستهلك يستدعي next يدوياً ثم يترك المؤشر إلى إغلاق صريح.

javascript يغلق الخروج المبكر هذا المولد
const events = [];
function* ownedSequence() {
  try { yield 1; yield 2; }
  finally { events.push("closed"); }
}
for (const value of ownedSequence()) {
  events.push(String(value));
  break;
}
console.log(events.join(","));
الناتج المتوقع
1,closed

لا يصل إلى yield الثانية لكن finally تسجل التنظيف، ولا مورد خارجي هنا.

اختيار دلالات المجموعة عمداً

تعبر Set عن العضوية بلا تكرار، وتربط Map المفاتيح بالقيم وتحفظ ترتيب الإدراج للمرور. تستخدم مفاتيح الكائن الهوية؛ فيبقى سجلان متشابهان مفتاحين مختلفين. ولا تزيل Set تكرار الكائنات حسب id تلقائياً. حدّد مساواة المجال ثم اختر معرفاً ثابتاً متحققاً منه إن كان هو الهوية. حدّ التحويلات واستخدم التكرار غير المتزامن للقيم الواصلة كذلك فعلاً، لا لكل مصفوفة عادية.

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

إرجاع المرور الثاني فراغاً

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

إرجاع for...in مفاتيح غير متوقعة

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

استنفاد تسلسل كسول للذاكرة

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

اختبر فهمك

1. لماذا حجم Set لكائنين مستقلين {id:1} يساوي اثنين؟

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

تستخدم العضوية هوية الكائن لا مقارنة id. إن احتاج المنتج تفرداً بالمعرف فصادق عليه واستخدم Map بمفتاح id أو قاعدة إزالة مقصودة. حدّد الفائز عند التكرار بدلاً من مصادفة المرور.

2. يولد المولد واحداً واثنين ثم يعيد ثلاثة. ماذا يحوي النشر؟

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

يحوي [1, 2]. ترافق قيمة return نتيجة الانتهاء ولا تعد عنصراً مولداً. افحص next يدوياً إن كشف العقد نتيجة نهائية أو استخدم yield للثلاثة إن انتمت للتسلسل.

أهم ما تعلمته

  • افصل البيانات القابلة للإعادة عن المؤشر المستهلك.
  • الكسل والحدود والمساواة والتنظيف عقود صريحة.

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