首页 > 解决方案 > 为什么在再次为生成器设置变量后为生成器设置变量?(本案例不同于普通的生成器示例)

问题描述

在为生成器设置变量后,例如 let gene = generator();

通常,我需要做的是gene.next() 来迭代上面制作的生成器。但是,在下面这个例子中,(完整代码请参考链接)

https://codepen.io/jotnajoa/pen/MWwzpJJ

在再次为生成器设置变量后设置另一个变量。我不知道为什么会这样。另外,我没有得到

let result = genratorAnimation.next();
//genratorAnimation.next();
let interval = setInterval(function(){
   if(!result.done) {
     genratorAnimation.next();
   }
   else {
    clearInterval(interval)
   }
}, 50);

在这段代码的最后。因为,据我了解,当一切都产生时,生成器会为“完成”返回“真”。

然而,在这个例子中,它正在做相反的事情。这是“not result.done”,在运行生成器时是错误的。

为什么?

作为总结,

1)为什么我需要为间隔设置另一个变量。

我假设, setInterval( ######## ) 就足够了,而不是 let xxx = setInterval 来运行循环。因为,如果我为 setInterval 设置变量,在我输入变量“xxx”之前什么都不会发生。但是在这段代码中,即使我不调用变量,它也会运行。

2)为什么 !result.done 使循环播放。因为 !result.done 是假的,如果假在 if 语句中,事情会在 if 之后发生。

If 语句仅在条件为真时运行。不是吗?

先感谢您。

标签: javascriptd3.jsgeneratordata-visualization

解决方案


为什么我需要为间隔设置另一个变量。

setInterval()用于重复调用函数或执行代码片段,每次调用之间有固定的时间延迟。这意味着提供给函数的函数如果不通过调用clearInterval()函数setInterval()停止,将永远被调用和执行。

clearInterval() 需要一个间隔引用(变量),在这个片段中,我们可以在不清除间隔的情况下拥有代码,但它会继续运行并消耗资源内存/CPU,最终没有任何影响,因此最好将其从执行队列中删除.

为什么 !result.done 使循环播放。

生成器函数将继续返回result.donefalse直到返回最后一个结果,它将返回true: 和! (逻辑非)用于否定布尔值,所以如果result.done为假,!result.done将否定它并使其成为true。它在您的代码片段中的编写方式是编码风格的问题,它可以写成:

let result = genratorAnimation.next();
//genratorAnimation.next();
let interval = setInterval(function(){
   if(result.done) {
     clearInterval(interval);
   }
   else {
    genratorAnimation.next();
   }
}, 50);

推荐阅读