使用JavaScript async而不是setInterval

时间:2017-12-29 07:10:08

标签: javascript asynchronous async-await

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

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

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

setInterval(update, 1000)

两者之间是否有任何功能差异?

2 个答案:

答案 0 :(得分: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()
  }
}

答案 1 :(得分:0)

你的问题是要求settimeout和setinterval之间的区别来实现重复,我觉得这里没有asycn / await的相关性,你刚刚使用它来避免在setTimeout中调用相同的函数。

或者你可能会说相关性是async / await正在做什么,setTimeout做了什么,但是正如Ayush指出的那样,你没有任何选项可以取消循环,你可以通过setTimeout获得这个循环 因此,以下链接可能会回答您的好奇心 setTimeout or setInterval?

感谢