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

时间:2015-12-05 11:18:02

标签: javascript node.js ecmascript-6

此代码生成错误:

$summ =($rez-15)*3/100*800;

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

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

4 个答案:

答案 0 :(得分:11)

  

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

是。您无法使用回调中的yield

  

有一种优雅的方法可以解决这个问题吗?

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

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

function *giveNumbers() {
    for (let item of [1, 2, 3])
        yield item;
}

答案 1 :(得分:2)

yield 将结果返回给调用者 让我们假设forEach回调是一个生成器(在那里设置一个服装生成器不是问题) - 这意味着当回调yield结果时 - 它将它返回到forEach

基本上,在您的问题中,您尝试做的是:

callback -> yields to forEach -> yields to giveNumbers -> yields to caller

因此,forEach应将结果返回giveNumbers。但由于forEach不能像这样工作,所以没有服装forEach的重新原型数组是不可能的。

实际上,你的第二个代码片段最优雅的开始。

答案 2 :(得分:2)

您可以使用yield *语法。

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

答案 3 :(得分:0)

您也可以使用while并传递参数(Demo

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;
    }
}