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 هذه الميزة.
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).