失败前轮询结果n次(尝试之间有延迟)

krl*_*krl 1 javascript node.js async-await bluebird

我们需要编写一个Node.js函数,该函数轮询某个API端点以获取先前请求的计算结果。结果需要一个随机的时间才能生成,而可能根本不生成。我们希望尽快得到它,但是我也不想等待太久,这意味着在一定数量的API调用之后,我们希望函数失败(拒绝Promise)。

我们的代码和API之间存在一种通信方式。

const Bluebird = require('bluebird');

function getResult() {
  return new Bluebird(async function (resolve, reject) {

    let counter = 0;

    while (counter < 10) {
      await Bluebird.delay(1000);

      const res = await apiCall();
      if (res.data) {
        resolve(res.data);
      } else {
        counter += 1;
      }
    }

    reject('timeout');
  });
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

Ber*_*rgi 5

否。这是Promise构造函数antipattern的async / await版本!当您调用时resolve,它甚至不会停止循环,或者在引发异常时(例如,当resis null)拒绝它。
你应该用

async function getResult() {
  for (let counter = 0; counter < 10; counter += 1) {
    await Bluebird.delay(1000);
    const res = await apiCall();
    if (res.data) {
      return res.data;
    }
  }
  throw new Error('timeout');
}
Run Code Online (Sandbox Code Playgroud)

如果您要确保返回的是Bluebird承诺,而不是本地的,则将其包装Bluebird.method或告诉您的翻译者使用Bluebird。