javascript - 如何有条件地停止 JavaScript 生成器?

标签 javascript c# iterator generator

使用如下迭代器:

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 因为 undefinedif 处理),但仍然是 string | undefined .

这使我得出结论,正如 Felix 所说,终止生成器函数的任何操作都将正确产生 done: true项目,但似乎 return更可取,因为逃逸分析适用于它,而它不适用于 break .

仍然无法找到有关此的官方消息,但这对我来说已经足够了。

关于javascript - 如何有条件地停止 JavaScript 生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43813244/

相关文章:

c# - C# 中的 Nodejs 等效于流式 IO,无需缓冲来自 requestContext 的内容

c# - 在 C# 中的 foreach 语句的每次迭代中是否调用返回集合的方法?

javascript - 如何使 href 与 ng-click 中的函数结果一起使用?

javascript - 将 socket.on 包装为 promise

javascript - 无法解析 JSON 文件 - 意外的标记

C++ 查找算法 : How do I find the last occurance of an element?

单独文件中的 C++ 内部模板类

javascript - 从另一个函数调用一个函数,反之亦然,提示在定义之前使用

c# - 从接口(interface)转换的 lambda 表达式

c# - .net 内存使用情况,决定私有(private)字节大小的因素