yield في JavaScript

من موسوعة حسوب

الكلمة المحجوزة yield تُستخدَم لإيقاف تنفيذ دالة مولِّدة (function*‎) مؤقتًا واستئناف تنفيذها.

البنية العامة

[rv] = yield [expression];

expression

تعريف القيمة التي ستُعاد من الدالة الموِّلدة عبر بروتوكول iterator، وإذا لم تُحدَّد هذه القيمة فستُعاد القيمة undefined.

rv

إسناد القيمة الاختيارية المُمرَّرة إلى الدالة next()‎ التي تُستخدَم لاستئناف التنفيذ.

الوصف

الكلمة المحجوزة yield توقف تنفيذ دالة مولِّدة مؤقتًا وستُعاد قيمة التعبير الذي يلي الكلمة المحجوزة yield إلى التعبير البرمجي الذي استدعى الدالة المولِّدة؛ ويمكن عدّ الكلمة المحجوزة yield على أنها تشبه return لكن للدوال المولِّدة.

تُعيد الكلمة المحجوزة yield كائنًا من النوع IteratorResult له خاصيتان هما value و done، والخاصية value ستحتوي على نتيجة التعبير الذي يلي الكلمة المحجوزة yield، وستكون قيمة الخاصية done مساويةً للقيمة false مما يشير إلى أنَّ تنفيذ الدالة المولِّدة لم ينتهِ بعد.

بعد إيقاف تنفيذ الدالة المولِّدة مؤقتًا عند ورود التعبير yield فسيبقى تنفيذ الدالة متوقفًا إلى أن تستدعى الدالة next()‎ على الدالة المولِّدة، وستستئنف حينئذٍ الدالةُ تنفيذها إلى أن تصل إلى:

  • تعبير yield آخر، الذي يؤدي إلى إيقاف الدالة المولِّدة موقتًا مجددًا ويُعيد قيمةً جديدةً، وفي المرة القادمة التي ستستدعى فيها الدالة next()‎ سيُستأنف التنفيذ بعد تعبير yield الجديد.
  • رمي استثناء من الدالة المولِّدة عبر throw، وهذا سيوقف تنفيذ الدالة المولِّدة كليًّا، وسيستمر التنفيذ في البنية البرمجية التي استدعت الدالة المولِّدة.
  • الوصول إلى نهاية الدالة المولِّدة، وفي هذه الحالة سينتهي تنفيذ الدالة المولِّدة وسيُعاد كائن IteratorResult الذي تكون قيمة الخاصية value فيه هي undefined والخاصية done هي true.
  • تنفيذ التعبير البرمجي return، وفي هذه الحالة سيتوقف تنفيذ الدالة المولِّدة وسيُعاد الكائن IteratorResult وستكون قيمة الخاصية value فيه هي القيمة المُحدَّدة بعد تعبير return وقيمة الخاصية done هي true.

إذا مُرِّرَت قيمةٌ اختياريةٌ إلى الدالة Generator.prototype.next() فستصبح هذه القيمة هي القيمة المُعادة من تعبير yield الحالي في الدالة المولِّدة (أي قيمة rv، انظر «البنية العامة»).

أمثلة

الشيفرة الآتية تُصرِّح عن دالة مولِّدة بسيطة:

function* countAppleSales () {
  var saleList = [3, 7, 5];
  for (var i = 0; i < saleList.length; i++) {
    yield saleList[i];
  }
}

بعد تعريف الدالة المولِّدة، يمكن استخدامها كما في المثال الآتي:

var appleStore = countAppleSales(); // Generator { }
console.log(appleStore.next()); // { value: 3, done: false }
console.log(appleStore.next()); // { value: 7, done: false }
console.log(appleStore.next()); // { value: 5, done: false }
console.log(appleStore.next()); // { value: undefined, done: true }

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي 39 26 غير مدعومة 26 10

على النقيض من متصفح IE، يدعم متصفح Edge هذه الميزة.

مصادر ومواصفات