为了账号安全,请及时绑定邮箱和手机立即绑定

每 n 秒运行一次异步函数,如果异步函数花费的时间超过 n 秒,则等待

每 n 秒运行一次异步函数,如果异步函数花费的时间超过 n 秒,则等待

幕布斯7119047 2021-10-14 16:42:18
我希望异步函数以每秒一次的最大速率运行。async function update(){    await wait_for_response();}setInterval(update, 1000);在上面的代码中,如果函数花费的时间超过一秒,则下一次更新在最后一次完成之前开始。如果 update() 花费的时间超过 1 秒,我希望下一次更新等到最后一次更新完成,然后立即运行。是否有简单的内置方法或标准做法来实现这一点?
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

我认为setTimeout在这种情况下这将是一个更好的选择:


async function update() {

     const t1 = new Date();

     await wait_for_response();

     setTimeout(update, Math.max(0, 1000 - new Date + t1));

}

update();


查看完整回答
反对 回复 2021-10-14
?
白板的微信

TA贡献1883条经验 获得超3个赞

这个使用承诺链的简单构造可以为您处理:


let lastPromise = Promise.resolve();

function update() {

  lastPromise = lastPromise.then(wait_for_response, wait_for_response);

}


setInterval(update, 1000);

如果我们担心链无限增长,我们可以使用这个版本:


let lastPromise = Promise.resolve();

function update() {

  const p = lastPromise;

  function cleanup() {

    if (lastPromise === p) {

       lastPromise = Promise.resolve();

    }

  }

  lastPromise = lastPromise

    .then(wait_for_response, wait_for_response)

    .then(cleanup, cleanup);

}


setInterval(update, 1000);


查看完整回答
反对 回复 2021-10-14
  • 2 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信