Javascript从嵌套在生成器内的函数中产生

Dmi*_* S. 19 javascript node.js ecmascript-6

此代码生成错误:

function *giveNumbers() {
    [1, 2, 3].forEach(function(item) {
        yield item;
    })
}
Run Code Online (Sandbox Code Playgroud)

这可能是因为yield在一个不是生成器的函数内部.有一种优雅的方法来克服这个问题吗?我的意思是:

function *giveNumbers() {
    let list = [1, 2, 3];
    for (let i = 0; i < list.length; i++) {
        yield list[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 12

这可能是因为yield在一个不是生成器的函数内部.

是.您无法使用yield回调.

有一种优雅的方法来克服这个问题吗?

取决于用例.通常没有理由真正想要yield回调.

在你的情况下,你想要一个for…of循环,它几乎.forEach所有方面都优于:

function *giveNumbers() {
    for (let item of [1, 2, 3])
        yield item;
}
Run Code Online (Sandbox Code Playgroud)

  • Ceterum censeo`forEach`adminndam esse a ES6. (3认同)
  • 对于那些不懂拉丁语(像我一样)或懒得谷歌翻译的人来说:"`forEach`肯定会在ES6中消失". (2认同)

asm*_*smn 5

你可以使用yield *语法。

function *giveNumbers() {
    yield * [1, 2, 3].map(function(item) {
        return item;
    })
}
Run Code Online (Sandbox Code Playgroud)

  • 这不会屈服于父范围 (2认同)