在Javascript中,如何将generator.next赋值给变量?
使用Javascript生成器时,我可以执行以下操作:在Javascript中,如何将generator.next赋值给变量?,javascript,function,ecmascript-6,generator,Javascript,Function,Ecmascript 6,Generator,使用Javascript生成器时,我可以执行以下操作: function* Gen() { while(true) console.log(yield); } let gen = Gen(); gen.next('first'); // outputs 'first' gen.next('second'); // outputs 'second' 现在我想把gen.传递给另一个函数,让这个函数控制生成器。但是我犯了一个错误 let next = gen.next; next('thi
function* Gen() {
while(true) console.log(yield);
}
let gen = Gen();
gen.next('first'); // outputs 'first'
gen.next('second'); // outputs 'second'
现在我想把gen.传递给另一个函数,让这个函数控制生成器。但是我犯了一个错误
let next = gen.next;
next('third'); // TypeError: Cannot read property '_invoke' of undefined
这可能吗?若否,原因为何
更新(基于答案):
这是可能的。错误是由于在我为变量指定gen.next定义时丢失了作用域。为了避免这种情况,我可以将范围绑定为
let next = gen.next.bind(gen);
这里学到的教训是,像发电机一样的iterable有一个范围,那就是iterable本身。这是有道理的,因为犹太人需要维持一个国家 这不起作用,因为如果不对对象(此处为
gen
)调用next
,此
绑定不再有效
调用gen.next()
和next()
在JavaScript中是不同的如果您不绑定它,我相信这将是默认的上下文(窗口
)
只需像那样绑定它,它就可以工作,因为此
将是gen
,即使您没有指定它:
let gen = Gen();
gen.next('first'); // outputs 'first'
gen.next('second'); // outputs 'second'
// Now let's see if we can assign gen.next to a variable
let next = gen.next.bind(gen);
next('third');
我从未见过像这样使用next
。这不是它的目的。如果你想要一个自定义的,实现你自己的interator@Adelin我明白你的意思。但这是我正在从事的项目所必需的。正在尝试将插件添加到已在使用Generators的库中。你可能想读书。(共和党没有否决)这确实有帮助。谢谢Adelin@NinaScholz它确实可以工作,只是不需要codesandbox.io工具,但我不知道如何使用它,而且时间还早。使用JSFIDLE,它就像一个符咒一样工作。@Pubudodangoda很高兴这有帮助;)如果答案符合您的需要,请将其标记为正确@sjahan是的stackoverflow直到我发布问题10-15分钟后才让我接受。