javascript – 在失败之前对结果进行n次轮询(尝试之间的延迟)

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

我们的代码和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');
  });
}

这是正确的方法吗?

解决方法:

不.这是Promise constructor antipattern的异步/等待版本!当你调用resolve时它甚至不会停止循环,或者在抛出异常时拒绝(例如当res为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');
}

如果您想确保返回Bluebird承诺而不是本机承诺,请将其包装在Bluebird.method中,或者告诉您的转发器使用Bluebird.

上一篇:javascript – Promise返回undefined


下一篇:javascript – promisified mysql模块如何与NodeJS一起使用?