我正在尝试实现async库,以便它轮询一个事务的API,直到其中一个事务成功。
router.get('/', async function (req, res) {
let apiMethod = await service.getTransactionResult(txHash).execute();
async.retry({times: 60, interval: 1000}, apiMethod, function(err, result) {
if(err){
console.log(err);
}else{
return result;
}
});
});
module.exports = router;然而,我无法用apiMethod的await函数找到正确的语法。
我得到了错误Error: Error: Invalid arguments for async.retry
如何实现它,以便每次失败时都会记录错误,如果60重试循环在完成之前成功,那么如何成功退出60重试循环?(如果它在例如14处结束,则停止重试)。
发布于 2022-01-21 04:33:04
您可以尝试异步重试库。
await retry(
async (bail) => {
const res = await service.getTransactionResult(txHash).execute();
if (res.status >= 400) {
bail(new Error());
return;
}
const data = await res.text();
return data;
},
{
retries: 60,
}
);发布于 2022-01-21 04:33:40
在我看来,apiMethod应该是一个未解决的承诺,试试这个
router.get('/', async function (req, res) {
let apiMethod = () => (service.getTransactionResult(txHash).execute())
async.retry({times: 60, interval: 1000}, apiMethod, function(err, result) {
if(err){
console.log(err);
}else{
return result;
}
});
});
module.exports = router;发布于 2022-01-21 16:48:32
var promises = [];
let request = service.getTransactionResult(txHash);
for(let i = 0; i < 60; i++){
promises.push(request);
}
for(let i = 0; i < 60; i++){
try{
let result = await promises[i].execute();
}catch(err){
console.log(err);
await new Promise(resolve => setTimeout(resolve, 1000));
}
}我不知道如何处理异步库,但是在我的情况下,这个方法适用于轮询,在这种情况下,会抛出错误,等待事务尚未处理,然后重新尝试。
https://stackoverflow.com/questions/70796366
复制相似问题