是否可以将ECMAScript 6发生器重置为初始状态? [英] Is it possible to reset an ECMAScript 6 generator to its initial state?

查看:153
本文介绍了是否可以将ECMAScript 6发生器重置为初始状态?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题是:给定(非常简单的)生成器,是否可以将发生器恢复到原来的状态再次使用?

  var generator = function *(){
yield 1;
yield 2;
yield 3;
};

var iterable = generator();

for(let x of iterable){
console.log(x);
}

//此时,iterable被消耗。
//是否有一种方法可以通过只重新调用generate(),
//(或者可能通过重新调用generator()来将
//移回到起始点) ,只能通过使用原型
//或在可迭代对象中可用的构造方法)
//以下代码将再次工作?

for(let x of iterable){
console.log(x);
}

我希望能够将迭代传递给其他范围,迭代它,做一些其他的东西,然后可以在同一个范围内再次迭代。

解决方案

如果您的意图是


到其他范围,迭代它,做一些其他的东西,然后可以再次迭代一遍相同的范围。


然后你不应该尝试的唯一的事情是传递迭代器,而是传递生成器:

  var generator = function *(){
yield 1;
yield 2;
yield 3;
};

var user = function(generator){

for(let x of generator()){
console.log(x);
}

for(let x of generator()){
console.log(x);
}
}

或者只是做一个循环迭代器并检查同时迭代

  var generator = function *(){
while(true){
yield 1;
yield 2;
yield 3;
}
};

(x in i){
console.log(x);
if(x === 3){
break;
}
}


My question is this: Given the provided (very simple) generator, is it possible to return the generator back to its original state to use again?

var generator = function*() {
    yield 1;
    yield 2;
    yield 3;
};

var iterable = generator();

for (let x of iterable) {
    console.log(x);
}

// At this point, iterable is consumed.
// Is there a method for moving iterable back
// to the start point by only without re-calling generator(),
// (or possibly by re-calling generator(), only by using prototype 
//  or constructor methods available within the iterable object)
// so the following code would work again?

for (let x of iterable) {
    console.log(x);
}

I would like to be able to pass the iterable off to some other scope, iterate over it, do some other stuff, then be able to iterate over it again later on in that same scope.

解决方案

If your intention is

to some other scope, iterate over it, do some other stuff, then be able to iterate over it again later on in that same scope.

Then the only thing you shouldn't try doing is passing the iterator, instead pass the generator:

var generator = function*() {
    yield 1;
    yield 2;
    yield 3;
};

var user = function(generator){

    for (let x of generator()) {
        console.log(x);
    }

    for (let x of generator()) {
        console.log(x);
    }
}

Or just make a "round robin" iterator and check while iterating

var generator = function*() {
    while(true){
        yield 1;
        yield 2;
        yield 3;
    }
};

for( x in i ){
    console.log(x);
    if(x === 3){
        break;
    }
}

这篇关于是否可以将ECMAScript 6发生器重置为初始状态?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆