setInterval node.js中的async和sync func有什么区别

setInterval node.js中的async和sync func有什么区别,node.js,Node.js,我知道setInterval函数将运行一些定期任务。但是我想知道async和sync func之间的区别。这里有一个例子 const fetchFile = async ()=>{//dosometing} setInterval(async()=>{ fetchFile() }, 1000) setInterval(async()=>{ await fetchFile() }, 1000) setInterval(()=>{ fetchFile() }

我知道setInterval函数将运行一些定期任务。但是我想知道async和sync func之间的区别。这里有一个例子

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

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

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

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

三种实现之间的间隔本身没有实际的区别。setInterval不注意回调的返回值,因此异步版本返回承诺并不重要

如果要在回调函数中为自己的实现使用wait,可以将其声明为async,但无论使用wait还是.then,这都不会影响事件循环。使用wait,只要您在承诺上点击wait,回调将立即返回,事件循环将能够处理其他事件。如果你这样做的话,情况也是如此。当异步操作正在运行且promise正在等待获得完成通知时,事件循环可以处理其他事件

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

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

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

事实上,在异步函数中,return-fetchFile和return-await-fetchFile之间没有区别


在所有示例中,对fetchFile没有错误处理。如果它拒绝,您将有一个未处理的拒绝。要捕获这些错误,您可以使用try/catch或use.catch来包围wait。

三种实现之间的间隔本身没有实际区别。setInterval不注意回调的返回值,因此异步版本返回承诺并不重要

如果要在回调函数中为自己的实现使用wait,可以将其声明为async,但无论使用wait还是.then,这都不会影响事件循环。使用wait,只要您在承诺上点击wait,回调将立即返回,事件循环将能够处理其他事件。如果你这样做的话,情况也是如此。当异步操作正在运行且promise正在等待获得完成通知时,事件循环可以处理其他事件

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

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

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

事实上,在异步函数中,return-fetchFile和return-await-fetchFile之间没有区别

在所有示例中,对fetchFile没有错误处理。如果它拒绝,您将有一个未处理的拒绝。要捕获这些错误,您可以使用try/catch或use.catch来包围wait。

首先,您将异步函数回调传递给setInterval函数,而setInterval函数不需要异步函数,从而导致您缺少正确的错误处理

所以如果你想运行一些周期函数,我建议这样做,你可以通过错误处理对代码进行更多的控制。请记住,这可能会阻止事件循环,因为您的代码只能通过微任务Queue运行

const util=require'util'; const sleep=util.promisifysetTimeout; const fetchFile=async=>{ log'some async function'; }; 异步函数fetchSomeFile{ 试一试{ 等待获取文件; 睡眠1000; 获取文件; }犯错误{ console.logerr; } } fetchSomeFile.catcherr=>console.logerr; 我建议观看好的演示-违背承诺-James Snell,NearForm

首先,您将异步函数回调传递给setInterval函数,而setInterval函数不希望异步函数导致您缺少正确的错误处理

所以如果你想运行一些周期函数,我建议这样做,你可以通过错误处理对代码进行更多的控制。请记住,这可能会阻止事件循环,因为您的代码只能通过微任务Queue运行

const util=require'util'; const sleep=util.promisifysetTimeout; const fetchFile=async=>{ log'some async function'; }; 异步函数fetchSomeFile{ 试一试{ 等待获取文件; 睡眠1000; 获取文件; }犯错误{ console.logerr; } } fetchSomeFile.catcherr=>console.logerr;
我建议观看好的演示-违背承诺-詹姆斯·斯内尔,NearForm

在你的例子中没有实际的区别。所有3个间隔的行为方式都相同。node.js事件循环中的这些间隔是否都相同?是否需要等待获取
要完成的文件?如果我需要等待文件完成,会发生什么。它会阻止事件循环吗?在您的示例中没有实际的区别。所有3个间隔的行为方式都相同。node.js事件循环中的这些间隔是否相同?是否需要等待fetchFile完成?如果需要等待fetchFile完成,会发生什么情况。它会阻止事件循环吗?谢谢。如果我没有捕捉到错误,它会阻止事件循环吗?顺便说一句,什么是任务队列?如果不捕获错误,您可以将应用程序置于不可预测的状态,这是非常糟糕的情况。关于microstack和eventloop,我建议大家阅读这篇博客文章,谢谢。如果我没有捕捉到错误,它会阻止事件循环吗?顺便说一句,什么是任务队列?如果不捕获错误,您可以将应用程序置于不可预测的状态,这是非常糟糕的情况。关于microstack和事件循环,我建议您阅读本系列博客文章