首页 > 解决方案 > 延迟的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 秒。

不幸的是,我无法通过查看其他问题自己解决它。

我很感激任何帮助。

最好的问候帕达

标签: javascriptnode.js

解决方案


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如果需要处理错误,可以包装函数体。


推荐阅读