首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在while循环中等待setInterval promise会导致大量调用堆积起来?

为什么在while循环中等待setInterval promise会导致大量调用堆积起来?
EN

Stack Overflow用户
提问于 2020-02-21 01:36:48
回答 1查看 136关注 0票数 0

我只是想做一个简单的异步函数,按计划运行。我刚从一个柜台开始。但是这个循环的行为与我想象的不同。

代码语言:javascript
复制
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秒计数一次。

EN

回答 1

Stack Overflow用户

发布于 2020-02-21 01:44:27

间隔会重复触发,您会创建越来越多的间隔。

您首先创建一个间隔,在3秒之后,它将触发、递增count并解析promise。由于promise已经解决,您可以重复您的循环并创建一个额外的间隔。再过3秒后,两个间隔的都会熄灭。它们每次递增计数,并且每个都解析其相应的promise (其中一个已经解析,因此什么也不做)。然后再重复一次,现在间隔3次。

如果您想让代码保持与现在大致相同的方式,请使用超时而不是间隔。超时只发生一次,所以当一个结束时,你可以安全地创建另一个,而不会堆积起来。

代码语言:javascript
复制
setTimeout(() => {
  count++
  res(3);
}, 3000)

或者,您可以修改代码以仅使用单个间隔,但在这种情况下,promises将不是一个很好的选择,因为promises只能解析一次。

代码语言:javascript
复制
function runCheckChats() {
  setInterval(() => {
    count++;
    console.log(`count = ${count}`)
  }, 3000);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60325674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档