Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中,如何将generator.next赋值给变量?_Javascript_Function_Ecmascript 6_Generator - Fatal编程技术网

在Javascript中,如何将generator.next赋值给变量?

在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

使用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('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分钟后才让我接受。