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

Javascript从嵌套在生成器中的函数中生成,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,此代码生成一个错误: function *giveNumbers() { [1, 2, 3].forEach(function(item) { yield item; }) } 这可能是因为收益率在一个不是生成器的函数中。有没有一种优雅的方法可以克服这个问题?我的意思是除了: function *giveNumbers() { let list = [1, 2, 3]; for (let i = 0; i < list.length; i+

此代码生成一个错误:

function *giveNumbers() {
    [1, 2, 3].forEach(function(item) {
        yield item;
    })
}
这可能是因为收益率在一个不是生成器的函数中。有没有一种优雅的方法可以克服这个问题?我的意思是除了:

function *giveNumbers() {
    let list = [1, 2, 3];
    for (let i = 0; i < list.length; i++) {
        yield list[i];
    }
}
函数*giveNumbers(){
让list=[1,2,3];
for(设i=0;i
yield将结果返回给调用者。
让我们假设
forEach
回调是一个生成器(在那里设置一个生成器不是问题)-这意味着当回调
产生
结果时,它将返回给
forEach

基本上,在你的问题中,你试图做的是:

callback -> yields to forEach -> yields to giveNumbers -> yields to caller
因此,
forEach
应该将结果返回给
giveNumbers
。但是由于
forEach
不是这样工作的,因此不使用costment
forEach
重新构建阵列原型是不可能的。实际上,您的第二个代码片段是最优雅的

这可能是因为收益率在一个不是生成器的函数中

对。您不能从回调中使用
yield

有没有一种优雅的方法可以克服这个问题

取决于用例。通常没有理由真正想从回调中
产生

在您的情况下,您需要一个
for…of
循环,它无论如何都要优于
.forEach


您还可以使用
while
并传递参数()


您可以使用
yield*
语法

function *giveNumbers() {
    yield * [1, 2, 3].map(function(item) {
        return item;
    })
}

Ceterum censeo
forEach
delendam有一个ES6。对于那些不懂拉丁语(像我一样)或者懒得用谷歌翻译的人来说:“
forEach
肯定会在ES6中被删除”。@Palisand,
forEach
必须(应该)从ES6@Palisand不可否认,这至少是我的意思,我的拉丁语有点生疏,我不知道“ES6”是否是正确的选择here@Bergi-“实际上没有理由想从回调中屈服”-原因是使异步代码同步。为什么?让它看起来更好。是否有一些旁路来实现这一点?这不会屈服于父范围
function *giveNumbers(array, start) {
    var index = start || 0;
    while(array.length > index + 1) {
        yield array[index++];
    }
    return array[index];
}


var g = giveNumbers([1,2,3], 0);

var finished = false;

while(!finished) {
    var next = g.next();
    console.log(next.value);
    if(next.done) {
        finished = true;
    }
}
function *giveNumbers() {
    yield * [1, 2, 3].map(function(item) {
        return item;
    })
}