javascript - 为什么在再次为生成器设置变量后为生成器设置变量?(本案例不同于普通的生成器示例)
问题描述
在为生成器设置变量后,例如 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 语句仅在条件为真时运行。不是吗?
先感谢您。
解决方案
为什么我需要为间隔设置另一个变量。
setInterval()用于重复调用函数或执行代码片段,每次调用之间有固定的时间延迟。这意味着提供给函数的函数如果不通过调用clearInterval()函数setInterval()
停止,将永远被调用和执行。
clearInterval() 需要一个间隔引用(变量),在这个片段中,我们可以在不清除间隔的情况下拥有代码,但它会继续运行并消耗资源内存/CPU,最终没有任何影响,因此最好将其从执行队列中删除.
为什么 !result.done 使循环播放。
生成器函数将继续返回result.done
,false
直到返回最后一个结果,它将返回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);
推荐阅读
- bash - 将变量传递给 cp / mv
- visual-studio-code - vsc 扩展配置抛出“json 传输失败!” 错误
- solr - 我可以查询不在 solr 配置中的新处理程序吗?
- ethereum - 通过 ethereum RPC JSON API 将 Tether USDT 发送到另一个 Tether 钱包
- python - 网络抓取:如何仅提取我需要的信息
- java - Executable Jar:执行 jar 时访问 pom 的问题
- php - WooCommerce - 如果金额大于 x,则将每个运费设置为 0(我有 90% 的工作片段但无法修改)
- javascript - 有没有办法一次捕获多个相同类型的事件?
- ruby-on-rails - 与名称中最后一个字母 s 的 Leagcy 表连接
- c++ - 如何在遍历时添加要设置的元素?