我们需要编写一个Node.js函数,该函数轮询某个API端点以获取先前请求的计算结果。结果需要生成随机时间,可能根本不会生成。我们希望尽快得到它,但我也不想等待太长时间,这意味着在经过一定数量的API调用后我们希望函数失败(拒绝承诺)。 / p>
我们的代码与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');
});
}
这是正确的方法吗?
答案 0 :(得分:5)
没有。这是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。