如何正确设置Interval Generator?

uee*_*iie 3 javascript generator setinterval

目标: 我想创建一个被调用内部的发电机的功能setInterval(),以及console.log1至10.

问题: 为了clearInterval()最后我需要一个条件来检查是否gen.next().done === true.但是每次条件运行时,它都会调用另一个.next() ,所以我得到的最终打印是: 1 3 5 7 9 undefined

如何在不调用的情况下设置done == true条件.next()?

function* myGen(){
    let counter = 0;
    for(let i = 0 ; i <= 10; i++){
        yield counter++;    
    }
}

const gen = myGen();
const start = setInterval(() => {
    if(gen.next().done){
        clearInterval(start);
    } else {
        console.log(gen.next().value);  
    }
}, 1500)
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 6

你记住变量中的对象而不是next第二次调用:

function* myGen(){
    let counter = 0;
    for(let i = 0 ; i <= 10; i++){
        yield counter++;    
    }
}

const gen = myGen();
const start = setInterval(() => {
    var next = gen.next();             // *** Save it here
    if(next.done){                     // *** Use it here...
        clearInterval(start);
    } else {
        console.log(next.value);       // *** ...and here
    }
}, 150)
Run Code Online (Sandbox Code Playgroud)


gue*_*314 5

您也可以使用for..of循环,setTimeout()以async/await避免需要检查.done属性值

function* myGen() {
  let counter = 0;
  for (let i = 0; i <= 10; i++) {
    yield counter++;
  }
}

const gen = myGen();

(async() => {
  for (let n of gen) {
    await new Promise(resolve => {
      setTimeout(() => {
        console.log(n);
        resolve()
      }, 1500)
    })
  }
})();
Run Code Online (Sandbox Code Playgroud)