путаница функции генератора в возвращаемом значении - PullRequest
0 голосов
/ 19 сентября 2018

Я читал о функции генератора, я думал, что с асинхронным ожиданием это более или менее одинаково, но ожидаемый результат отличается от фактического результата.

function* adding() {
  var result = 1 + 1
  return 20 + (yield result)
}

var sum = adding()
console.log(sum.next()) // not returning 22 but 2?
console.log(sum.next(10)) // where is 30 come from?

1 Ответ

0 голосов
/ 19 сентября 2018

Ключевое слово yield Пауза Функция генератора.Когда вы звоните .next() в первый раз, интерпретатор проходит через генератор, пока не встретит первый yield.Генератор остановится и вернет выражение, которое следует за yield, вызывающему .next().Таким образом, поскольку result начинается с 2, yield result приводит к тому, что первый вызов .next() возвращает 2.

Когда вы вызываете .next() с выражением, это выражение подставляется в функцию генератора, гдепоследняя пауза yield была.Итак, когда вызывается .next(10), эта строка здесь:

return 20 + (yield result)

превращается в

return 20 + (10)

, потому что 10 - это то, что было передано .next().Итак, в конце возвращается 20 + 10, что составляет 30.

Как видите, генераторы сильно отличаются от async / await, хотя они оба имеют делос управлением асинхронным потоком программ.

...