Вот упрощенная версия пример сброса генератора в Mozilla :

function* oddNumberGenerator() {
  let i = 1;
  while (true) {
    reset = yield i;
    i = reset ? 1 : i + 2;
  }
}

const oddNumberIterator = oddNumberGenerator();

console.log(oddNumberIterator.next()); // 1
console.log(oddNumberIterator.next()); // 3
console.log(oddNumberIterator.next()); // 5

console.log(oddNumberIterator.next(true)); // 1

console.log(oddNumberIterator.next()); // 3
console.log(oddNumberIterator.next()); // 5

Кажется, переданный true будет назначен reset, но yield уже должен был дать 7. Почему он дает 1 - какой порядок выполнения заставляет его возвращать не 7, а 1?

0
nonopolarity 20 Дек 2019 в 17:59

2 ответа

console.log(oddNumberIterator.next()); // 5

Как только эта строка завершается, генератор останавливается в правой части оператора yield, с i, равным 5. В настоящее время ожидаются инструкции, чтобы узнать, что назначить reset

console.log(oddNumberIterator.next(true)); // 1

Вызывая next и передавая true, вы говорите генератору возобновить работу, в результате чего предыдущий выход будет true. Таким образом, для reset устанавливается значение true, а генератор продолжает работать, устанавливая i в 1, повторяя цикл, а затем возвращая это значение 1. Возвращается значение 1 (вместе с done: false) и оно передается на консоль. журнал.

3
Nicholas Tower 20 Дек 2019 в 15:06

Значение, данное yield, является результатом next, а значение, данное next, является результатом yield. Они не должны быть одинаковыми.

1
Solomon Ucko 20 Дек 2019 в 15:02