使用如下迭代器:
function* idMaker(){
let index = 0;
while(index < 3)
yield index++;
}
如何确保根据条件提前停止生成器?
function* idMaker(){
let index = 0;
while(index < 3)
if (checker(index))
yield index++;
else
return;
}
在发电机中使用是否合适?我应该使用
break
而不是 yield break
也许就像在 C# 中一样?您能否在讨论此问题时包含指向 MDN 或规范的链接?
最佳答案
我决定使用以下代码通过实验验证这一点:
function checker(i) {
return i !== 2;
}
function* idMakerReturn(){
let index = 0;
while(index < 3)
if (checker(index))
yield index++;
else
return;
}
function* idMakerBreak(){
let index = 0;
while(index < 3)
if (checker(index))
yield index++;
else
break;
}
const a = idMakerReturn();
console.log('1', a.next());
console.log('2', a.next());
console.log('3', a.next());
const b = idMakerBreak();
console.log('1', b.next());
console.log('2', b.next());
console.log('3', b.next());
两种变体都正确返回
{ "done": true, "value": undefined }
破出时。我还通过观察推断的函数类型使用 TypeScript 进行了检查。function* idGen(seed: string | undefined) {
if (!seed) {
return; // Or `break`
}
const something = seed.trim();
}
与
return
一切正常,函数返回类型为 IterableIterator<T>
.与
break
我被要求提供一个标签以跳转到 something
不再被推断为可以安全访问(只是 string
因为 undefined
由 if
处理),但仍然是 string | undefined
.这使我得出结论,正如 Felix 所说,终止生成器函数的任何操作都将正确产生
done: true
项目,但似乎 return
更可取,因为逃逸分析适用于它,而它不适用于 break
.仍然无法找到有关此的官方消息,但这对我来说已经足够了。
关于javascript - 如何有条件地停止 JavaScript 生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43813244/