在失败之前轮询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时拒绝(例如,当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.method
或告诉你的转译器使用蓝鸟。