javascript - 延迟的nodejs异步循环
问题描述
当任务按计划花费更长的时间时,我正在尝试使循环工作的延迟更长。
目前我正在将此代码用于循环:
async function doSomeStuff() {
// do some stuff
// sometimes this action may take longer than 5 seconds
// after finishing wait 5 seconds
console.log('task completed, waiting 5 seconds for next run...');
}
setInterval(doSomeStuff, 5000);
就像一个魅力,但延迟固定在 5 秒,即使任务按计划花费更长的时间,所以有时新循环在完成最后一个后仅 1 秒开始,而不是等待 5 秒。
不幸的是,我无法通过查看其他问题自己解决它。
我很感激任何帮助。
最好的问候帕达
解决方案
async
函数不应与忽略它返回的承诺的 API 一起使用,例如setInterval
,以防预期应该链接承诺。
这可以通过递归async
函数来完成:
(async function doSomeStuff() {
await new Promise(resolve => setTimeout(resolve, 5000));
// do some stuff
await doSomeStuff();
})();
或无限循环:
(async function doSomeStuff() {
while (true) {
await new Promise(resolve => setTimeout(resolve, 5000));
// do some stuff
}
})();
try..catch
如果需要处理错误,可以包装函数体。
推荐阅读
- react-native - 如何使用 react-native 将文本输入格式化为电话号码
- haskell - Lens.Internal.Indexed 如何连接到键控容器?
- python - 如何添加具有相同名称的 pandas 列的值?
- sql - SQL (Hive) group-by 使用空值作为通配符
- python - 如何使用 Python 使用 Selenium 循环点击?
- reactjs - 来自 JSON 对象的动态反应路由
- gatsby - 有没有办法将具有相同基本 url 段的所有 url 路由到 Gatsby 中的同一页面?
- javascript - 滚动浏览 Chrome 中的某个部分时,jQuery Waypoint 粘性菜单出现闪烁问题
- python - “”的 Boto3 实例没有“桶”
- exit - 在这里尝试了所有解决方案以退出旧 IBM XT 中的 ROM Basic - 任何其他建议 - 系统不起作用