將參數傳遞給ES6生成器的next()
時,爲什麼忽略第一個值?更具體地說,爲什麼這個輸出說x = 44
而不是x = 43
:ES6生成器機制 - 傳遞給next()的第一個值會在哪裏?
function* foo() {
let i = 0;
var x = 1 + (yield "foo" + (++i));
console.log(`x = ${x}`);
}
fooer = foo();
console.log(fooer.next(42));
console.log(fooer.next(43));
// output:
// { value: 'foo1', done: false }
// x = 44
// { value: undefined, done: true }
我對這種發電機的行爲心智模式是這樣的:
- 回報
foo1
和屈服暫停(和所述next
呼叫返回foo1
取作爲參數42
) - 暫停,直到下一個呼叫到
next
- 旁邊產量繼續到符合
var x = 1 + 42
,因爲這是論據先前接收 - 打印
x = 43
- 距離最後
next
返回{done: true}
,忽略它的參數(43
)和停止。
現在很明顯,這不是發生了什麼事情。所以... 我在這裏錯了什麼?
調用'FOO()'不執行,直到第一個'yield',它僅創建發電機對象。第一個'next()'調用從函數的頂部開始執行,直到第一個「yield」 - 並返回在那裏產生的值。 – Bergi