使用JavaScript async而不是setInterval

问题描述 投票:1回答:2

假设我想每秒运行update()函数。

我可以通过两种方式做到这一点:

async function interval() {
  await new Promise((res, req) => { 
    setTimeout(res, 1000)
  })
  update()
  interval()
}

要么

setInterval(update, 1000)

这两者之间有什么功能差异吗?

javascript asynchronous async-await
2个回答
0
投票

你的问题是要求settimeout和setinterval之间的区别来实现重复,我觉得这里没有asycn / await的相关性,你刚刚使用它来避免在setTimeout中调用相同的函数。 或者你可能会说相关性是async / await正在做什么,setTimeout做了什么,但是正如Ayush指出的那样,你没有任何选项来取消循环,你可以通过setTimeout获得 因此,以下链接可能会回答您的好奇心。 setTimeout or setInterval? 谢谢


0
投票

不同之处在于你的interval函数会在完成时返回一个承诺。你需要添加一个return,以便它正常工作:

async function interval() {
  await new Promise((res, req) => { 
    setTimeout(res, 1000)
  })
  update()
  return interval()
//^^^^^^
}

现在,当update抛出异常时,承诺被拒绝,你可以.catch()错误。此外,interval递归调用将停止运行,而setInterval将继续运行。

此外,async / await语法的优点是可以避免递归来创建循环:

async function interval() {
  while (true) {
    await new Promise((res, req) => { 
      setTimeout(res, 1000)
    })
    update()
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.