setInterval node.js

时间:2019-12-30 06:02:48

标签: node.js

我知道setInterval函数是要运行一些定期任务。但是我想知道异步和同步函数之间的区别。这是一个例子。

const fetchFile = async ()=>{//dosometing}

setInterval(async()=>{
  fetchFile()
}, 1000)

setInterval(async()=>{
  await fetchFile()
}, 1000)

setInterval(()=>{
  fetchFile()
}, 1000)

2 个答案:

答案 0 :(得分:2)

三个实现之间的间隔本身没有实际差异。 setInterval()不会对回调的返回值给予任何关注,因此async版本返回诺言完全无关紧要。

如果您想在回调中使用async来实现自己的实现,则可以声明为await,但是无论使用await还是{{ 1}}。使用.then(),一旦您在诺言中击中await,回调将立即返回,并且事件循环将能够处理其他事件。如果您执行await,也是如此。当异步操作正在运行并且诺言正在等待通知完成时,事件循环可以处理其他事件。

您可能还想知道这两者之间没有区别:

fn().then()

甚至在fn(async()=>{ fetchFile() }, 1000) fn(async()=>{ await fetchFile() }, 1000) 世界之外。在setInterval()函数的最后一行进行等待不会添加任何内容。只是多余的。但是,在async情况下,由于setInterval()并没有关注回调的返回值,因此这三种实现之间没有任何实际差异。

实际上,在setInterval()函数中return fetchFile()return await fetchFile()之间没有区别。


在所有示例中,async上都没有错误处理。如果拒绝,您将有未处理的拒绝。要捕获这些错误,您可以将fetchFile()await括起来,或使用try/catch

答案 1 :(得分:1)

首先,您将async函数回调传递给setInterval函数,该回调函数不希望async函数会导致您缺乏适当的错误处理;

因此,如果您想运行一些定期函数,我建议使用类似的方法,在该方法中,您可以通过错误处理对代码进行更多控制。请记住,这可能会阻塞事件循环,因为您的代码只能通过microstask队列运行。

const util = require('util');
const sleep = util.promisify(setTimeout);

const fetchFile = async () => {
  console.log('some async function');
};

async function fetchSomeFile() {
  try {
    await fetchFile();
    sleep(1000);
    fetchSomeFile();
  } catch (err) {
    console.log(err);
  }
}

fetchSomeFile().catch(err => console.log(err));

我建议观看精彩的演讲-残破的承诺-James Snell,NearForm https://youtu.be/XV-u_Ow47s0