[英]Using setInterval inside javascript closures
我是 javascript 的新手,目前正在阅读有关关闭的信息。 我试图实现一个例子来更好地理解这个概念。
这是片段:
function getValue() {
let a = 0
const runner = async () => {
a += 1
}
setInterval(runner, 100)
return () => {
return a
}
}
let value = getValue()
console.log(value()) -----> logging statement 1
// some long operation
console.log(value()) -----> logging statement 2
但是,我看到的 output 是:
1
1
我期望两个日志语句 output 有两个不同的值。 我的理解是,一旦调用getValue()
, runner
程序 function 就会定期执行。 变量a
将得到更新,因此第二个console.log
应该打印一个递增的a
值。
除了错过主要部分外,您几乎就在那里。
操作发生得太快了。 运行第二次迭代不需要 100 毫秒,因此值保持不变。
尝试至少等待 100 毫秒,因为您的时间间隔需要增加该时间量。
如下例所示。
function getValue() { let a = 0 const runner = async () => { a += 1 } setInterval(runner, 100) return () => { return a } } let value = getValue() console.log(value()) // operations are happening too fast setTimeout(() => console.log(value()), 100); setTimeout(() => console.log(value()), 200); setTimeout(() => console.log(value()), 300);
function getValue() {
let a = 0
const runner = () => {
a += 1
console.log("Runner's A: " +a)
}
setInterval(runner, 100)
return () => {
return a
}
}
let value = getValue()
console.log(value());// -----> logging statement 1
// some long operation
console.log(value());// -----> logging statement 2
https://jsbin.com/geponejuba/edit?js,console,output
正如上面所指出的,js是单线程的,所以它的工作方式是,你的日志语句首先执行,如果没有别的事情要做,那么 setTimeout/setInterval 会被执行(这是一个非常简化的语句,你可以阅读详细版本的“事件循环”)
在我分享的示例 jsbin 中,您可以看到 setInterval 被调用并且确实在更新值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.