我知道setInterval函数是要运行一些定期任务。但是我想知道异步和同步函数之间的区别。这是一个例子。
const fetchFile = async ()=>{//dosometing}
setInterval(async()=>{
fetchFile()
}, 1000)
setInterval(async()=>{
await fetchFile()
}, 1000)
setInterval(()=>{
fetchFile()
}, 1000)
答案 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