Ключове слово yield використовується для призупинення та відновлення виконання функції-генератора (function* або застарілої функції-генератора).
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Синтаксис
[rv] = yield [expression];
expression- Визначає значення, яке буде повернене функцією-генератором згідно протоколу ітератора. Якщо пропущене, повертається
undefined. rv-
Отримує необов'язкове значення, передане у метод генератора
next()для відновлення виконання.
Опис
Ключове слово yield призупиняє виконання функції-генератора, а значення виразу, що стоїть після yield, повертається у інструкцію, що викликала генератор. Його можна уявити як генераторну версію ключового слова return.
Оператор yield може викликатись тільки безпосередньо з функції-генератора, яка його містить. Його не можна викликати з вкладених функцій або зворотних викликів.
Ключове слово yield здійснює виклик метода генератора next(), повертаючи об'єкт IteratorResult з двома властивостями, value та done. Властивість value є результатом обчислення виразу yield, а done дорівнює false, вказуючи, що функція-генератор ще не завершена.
Зупинившись на виразі yield, виконання коду генератора залишається на паузі до виклику методу генератора next(). Кожний раз, коли викликається метод генератора next(), генератор відновлює виконання та виконується, поки не досягає чогось з наступного:
- Ключове слово
yield, яке змушує генератор знову призупинитись та повертає нове значення генератора. Наступний раз, коли викликатиметьсяnext(), виконання продовжиться з інструкції, що стоїть одразу післяyield. - Оператор
throwвикористовується для викидання винятків у генераторі. Він повністю зупиняє виконання генератора, а виконання коду продовжується у місці виклику, як це стандартно відбувається, коли викидається виняток. - Досягнуто кінця функції-генератора; у цьому випадку виконання генератора завершується, а
IteratorResultповертається зvalue, що дорівнюєundefined, таdone, що дорівнюєtrue. - Досягнуто оператора
return. У цьому випадку виконання генератора завершується, аIteratorResultповертається зvalue, що дорівнює значенню, вказаному уreturn, таdone, що дорівнюєtrue.
Якщо у метод генератора next() було передано необов'язкове значення, воно стає значенням, що повертається поточною операцією генератора yield.
Маючи фрагменти коду, що виконуються генератором, оператори yield та здатність вказувати нове початкове значення, передаючи його у Generator.prototype.next(), генератори надають неймовірну потужність та контроль.
Приклади
Наступний код є оголошенням прикладу функції-генератора.
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 }
Специфікації
| Специфікація | Статус | Коментар |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Yield' in that specification. |
Standard | Початкове визначення. |
| ECMAScript (ECMA-262) The definition of 'Yield' in that specification. |
Living Standard |
Сумісність з веб-переглядачами
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
yield | Chrome Full support 39 | Edge Full support 12 | Firefox
Full support
26
| IE No support No | Opera Full support 26 | Safari Full support 10 | WebView Android Full support 39 | Chrome Android Full support 39 | Firefox Android
Full support
26
| Opera Android Full support 26 | Safari iOS Full support 10 | Samsung Internet Android Full support 4.0 | nodejs
Full support
4.0.0
|
Legend
- Full support
- Full support
- No support
- No support
- See implementation notes.
- See implementation notes.
- User must explicitly enable this feature.
- User must explicitly enable this feature.
Примітки щодо Firefox
- Починаючи з Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), завершена функція-генератор більше не викидає помилку
TypeError"generator has already finished". Замість цього вона повертає об'єктIteratorResultу вигляді{ value: undefined, done: true }(bug 958951). - Починаючи з Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30) розбір виразу
yieldбуло оновлено для відповідності специфікації ES2015 (bug 981599):- Вираз після ключового слова
yieldє необов'язковим, і його пропуск більше не викидає помилкуSyntaxError:function* countAppleSales() { yield; }
- Вираз після ключового слова