Вызов генератора создает объект класса Generator, который является итерируемым (iterable), т. е. его можно перебирать в цикле for..of или просто вызывая метод next(), при этом никакой код внутри генератора пока не выполняется.
Каждый вызов метода next() у созданного итератора запустить выполнение кода до первого yield, после чего будет возвращено значение, указанное в нем.
В метод next можно передать значение, которое будет возвращено yield:
Метод throw
У генераторов есть метод throw, который позволяет бросить исключение внутри генератора.
«Вброшенная» в строке (*) ошибка возникает в строке с yield(**). Далее она обрабатывается как обычно. В примере выше она перехватывается try..catch и выводится.
У генераторов есть метод return(value), которое останавливает работу генератора.
Если return(value) вызывает генератор, который находится в уже "завершённом" состоянии, генератор останется в "завершённом" состоянии. Если аргумент не был передан, свойство value вернёт тот же объект, что и .next(). Если аргумент был передан, он будет установлен как значение свойства value возвращаемого объекта.
function* gen() {
try {
// в этой строке возникнет ошибка
let result = yield "Сколько будет 2 + 2?"; // (**)
alert("выше будет исключение ^^^");
} catch(e) {
alert(e); // выведет ошибку
}
}
let generator = gen();
let question = generator.next().value;
generator.throw(new Error("ответ не найден в моей базе данных")); // (*)