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)
你记住变量中的对象而不是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)
您也可以使用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)