Объявление функции* используется для определения генератора, который возвращает объект генератора. Генераторы очень мощны для асинхронного программирования, поскольку они направлены на решение проблем обратного вызова.
В генераторе ключевое слово yield используется вместо return. Оператор yield приостанавливает выполнение функции и отправляет значение обратно вызывающему объекту, но сохраняет состояние, достаточное для возобновления функции из последнего состояния выполнения. Таким образом, функция продолжает выполнение сразу после последнего запуска yield. Метод next() используется для возврата объекта с двумя свойствами, done и value, и может использоваться для перехода в следующее состояние генератора.
Синтаксис:
function* function_name(param1, param2...)
{
function body
}
Приведенные ниже примеры демонстрируют использование объявления функции*.
Пример 1:
<html>
<body>
<script>
// Declaring a generator function
function* generator(i) {
yield i;
yield i + 50;
yield i + 100;
}
// Initialize the generator
const generate = generator(50);
// Console out the object returned
// by the next() method
let nextValObj = generate.next();
// Console out the value of the object
console.log(nextValObj.value);
// Console out next iterations
// of the generator
console.log(generate.next().value);
console.log(generate.next().value);
// This value would be undefined as
// the last defined one is i + 100
console.log(generate.next().value);
</script>
</body>
</html>
Выход:
50
100
150
undefined
Пример 2:
<html>
<body>
<script>
function* powerup(n) {
for (let num = n; ; num *= n) {
// Yield out the current number
yield num;
}
}
for (let power of powerup(5)) {
// Break if the number is
// more than 1024
if (power > 1024)
break;
console.log("Yielded:", power)
}
</script>
</body>
</html>
Выход:
Yielded: 5
Yielded: 25
Yielded: 125
Yielded: 625