此代码生成错误:
$summ =($rez-15)*3/100*800;
这可能是因为yield在一个不是生成器的函数内部。有一种优雅的方法来克服这个问题吗?我的意思是:
function *giveNumbers() {
[1, 2, 3].forEach(function(item) {
yield item;
})
}
答案 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;
}
}