定期解决 javascript 中的承诺

Periodically resolving a promise in javascript

假设我想在函数 运行.

之后每 2 秒解决一些 promise

我一开始尝试了这样的模式:setInterval(MyAsyncFunction, 2000),但是当然这不会在再次调用函数之前等待承诺解决。

我也试过 setInterval(async () => await MyAsyncFunction(), 2000),但这基本上是一回事,因为我只是将它包装在另一个承诺中,该承诺将在 setInterval 下降时解决。

有没有办法用 setInterval 做我想做的事情,或者有其他方法可以用 setTimeout 做这个吗?

Promise 仅解析一次,因此根据定义不能定期解析。

如果您定义了一个延迟函数,returns 一个在 timeout 毫秒后解析的承诺...

const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout));

您可以在异步循环中使用它:

async function foo(){
    for(let i = 0; i < 100; ++i){
        console.log("azrael");
        await delay(2000);
    }
}

如果你想调用async函数,然后等待它,然后等待额外的固定时间,然后重复,你可以通过以下方式实现。

您可以从该函数本身调用 setTimeout,因此它会在完成后安排下一个 运行:

async function myAsyncFunction() {
  return new Promise(resolve => setTimeout(() => {
    resolve('result');                       // resolves, then
    setTimeout(async () => {                 // schedules
      let result = await myAsyncFunction();  // self-call
      console.log('result')                  // and handles the result
    }, 2000);                                // after extra 2s
  }, 2000));          // imitates async function with 2s delay
}

async function main() {
  let firstResult = await myAsyncFunction();
  console.log(firstResult);  // handles first call
}

更简洁的方法是将其包装在另一个内部具有相同 setTimeout 的异步函数中:

async function myAsyncFunction() {
  // imitates async function
  return new Promise(resolve => setTimeout(() => resolve('result'), 2000));
}

async function delayLoop() {
  let result = await myAsyncFunction();  // waits for it
  console.log(result);
  setTimeout(delayLoop, 2000); // calls itself after extra 2s
}

delayLoop();

这样您就不必修改原始异步函数代码并将回调放在那里。

两个示例都将在第一个结果之前等待异步函数 2 秒,并在调用之间等待 4 秒 - 异步函数延迟 2 秒 + 之后额外延迟 2 秒。