gpt4 book ai didi

javascript - 停止生成器时,Break 如何在 for-of 循​​环中工作?

转载 作者:搜寻专家 更新时间:2023-11-01 05:28:34 24 4
gpt4 key购买 nike

所以有一些方法可以在 for of 循环中停止一个生成器,但是break 是如何向生成器发送一个信号(在与 for-of 中的 return 比较)?

请考虑代码。

例如,前面的代码只是将一个值从 1 增加到 10,并在两者之间执行暂停恢复

function *Generator() {

try {
var nextValue;

while (true) {
if (nextValue === undefined) {
nextValue = 1;
}
else {
nextValue++;
}

yield nextValue;
}
}
// cleanup clause
finally {
console.log( "finally has been reached." );
}
}

它使用 for of 循环 10 次:

var it = Generator();// it gets Generator's iterator

for (var v of it) {
console.log(v);

if (v > 9) {

//it.return("stop");//this is another tool for stopping, but it doesn't stop immediately.

break;

console.log("it won't run");//this line won't run
}
}

顺便使用it.return()的时候,实现的很清楚(it是main Object,已经拿到了控制权,但是呢>中断?);

最佳答案

像您的 it 生成器对象这样的可迭代对象有一个带有关键字 Symbol.iterator 的属性,它是一个返回迭代器的函数。迭代器需要有一个 .next() 方法来从一个项目前进到下一个项目。 Then 也可以选择有一个 .return() 方法,当你 breakreturnthrow 时调用该方法>,导致 for..of 在运行完成之前停止。因此,在您的情况下,break; 将自动调用 it.return()

它的另一面是在 ES6 生成器上,.next() 使它在当前暂停的 yield 处恢复执行,而 .return() 使其表现得像 yield 是一个 return 语句,因此循环内的 break 导致 yield nextValue; 的行为类似于 return;,这将退出生成器并触发 finally block 。

关于javascript - 停止生成器时,Break 如何在 for-of 循​​环中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42380087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com