在失败之前轮询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构造函数反模式的asynchronous/等待版本! 当你调用resolve ,它甚至不会停止循环,或者抛出exception时拒绝(例如,当resnull )。
你应该使用

 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.method或告诉你的转译器使用蓝鸟。