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

Javascript 每n秒运行一次异步函数,如果异步函数花费的时间超过n秒,请等待,javascript,node.js,Javascript,Node.js,我希望异步函数以每秒一次的最大速率运行 async function update(){ await wait_for_response(); } setInterval(update, 1000); 在上面的代码中,如果函数花费的时间超过一秒钟,则下一次更新将在最后一次更新完成之前开始 如果update()花费的时间超过1秒,我希望下一次更新等到最后一次更新完成后立即运行 是否有一种简单的内置方法或标准实践来实现这一点?这种使用承诺链的简单构造可以为您解决这一问题: let last

我希望异步函数以每秒一次的最大速率运行

async function update(){
    await wait_for_response();
}
setInterval(update, 1000);
在上面的代码中,如果函数花费的时间超过一秒钟,则下一次更新将在最后一次更新完成之前开始

如果update()花费的时间超过1秒,我希望下一次更新等到最后一次更新完成后立即运行


是否有一种简单的内置方法或标准实践来实现这一点?

这种使用承诺链的简单构造可以为您解决这一问题:

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);

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

async function update() {
     const t1 = new Date();
     await wait_for_response();
     setTimeout(update, Math.max(0, 1000 - new Date + t1));
}
update();

回答得很好@LucaVery smart,但你不需要到处都使用这些
+
1000-新日期+t1