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).