我只是想做一个简单的异步函数,按计划运行。我刚从一个柜台开始。但是这个循环的行为与我想象的不同。
async function runCheckChats(){
while(true){
count++
console.log(`this loop is running`);
await new Promise(res => {
setInterval(() => {
count++
res(3);
}, 3000)
})
console.log(`count = ${count}`)
}
}
runCheckChats();循环第一次运行时,计数加1。第二次,它增加了两个,以此类推。为什么会发生这种情况?当我们等待promise时,我们不是在事件循环中退出runCheckChats吗?为什么看起来像是边走边走,而不是等待?我希望它每3秒计数一次。
发布于 2020-02-21 01:44:27
间隔会重复触发,您会创建越来越多的间隔。
您首先创建一个间隔,在3秒之后,它将触发、递增count并解析promise。由于promise已经解决,您可以重复您的循环并创建一个额外的间隔。再过3秒后,两个间隔的都会熄灭。它们每次递增计数,并且每个都解析其相应的promise (其中一个已经解析,因此什么也不做)。然后再重复一次,现在间隔3次。
如果您想让代码保持与现在大致相同的方式,请使用超时而不是间隔。超时只发生一次,所以当一个结束时,你可以安全地创建另一个,而不会堆积起来。
setTimeout(() => {
count++
res(3);
}, 3000)或者,您可以修改代码以仅使用单个间隔,但在这种情况下,promises将不是一个很好的选择,因为promises只能解析一次。
function runCheckChats() {
setInterval(() => {
count++;
console.log(`count = ${count}`)
}, 3000);
}https://stackoverflow.com/questions/60325674
复制相似问题