在失败之前轮询结果n次(尝试之间有延迟)
Poll for a result n times (with delays between attempts) before failing
我们需要编写一个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');
});
}
这个方法正确吗?
No。这是Promise
构造函数反模式的async/await版本!它甚至不会在调用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。
相关文章:
- 关键帧之间的css3动画延迟
- JavaScript/jQuery-添加添加和删除类与下一个函数之间的延迟
- jquery .each 循环来执行每个数组项,它们之间有延迟
- AJAX 调用和表单提交之间的延迟
- foreach循环每次迭代之间的延迟
- 在javascript for循环的迭代之间应用延迟
- 如何在JavaScript中测量交互和mousedown事件之间的延迟
- 在Raphael JS中,不透明度:0和开始动画到不透明度:1之间的延迟
- 使用setTimeout在创建新元素之间强制延迟
- Javascript 或 angularjs 在刷新之间延迟浏览器关闭或选项卡关闭
- Javascript - 循环 3 个函数,每个函数之间有延迟
- 在操作之间发送 Ajax 消息集超时 m 延迟
- 在“for”循环迭代之间添加延迟
- 多边形的创建和显示之间的延迟
- 在jQuery的每次迭代之间应用延迟's.each()方法
- jQuery在列表中添加remove类,两者之间有延迟
- JavaScript/CSS:向DOM添加元素和应用其CSS规则之间的延迟
- JavaScript循环迭代中的POST之间需要延迟
- 为什么我的背景幻灯片动画在更改之间有延迟
- 使用$(“[property=value]”).click(),我希望两次单击之间有一个延迟