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
不是这样工作的,因此不使用costmentforEach
重新构建阵列原型是不可能的。实际上,您的第二个代码片段是最优雅的
这可能是因为收益率在一个不是生成器的函数中
对。您不能从回调中使用yield
有没有一种优雅的方法可以克服这个问题
取决于用例。通常没有理由真正想从回调中产生
在您的情况下,您需要一个for…of
循环,它无论如何都要优于.forEach
:
您还可以使用while
并传递参数()
您可以使用yield*
语法
function *giveNumbers() {
yield * [1, 2, 3].map(function(item) {
return item;
})
}
Ceterum censeoforEach
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;
})
}