Estoy tratando de implementar la biblioteca async para que sondee una API para una transacción hasta que una de ellas tenga éxito.
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; Sin embargo, no puedo descifrar la sintaxis correcta con la función de await de apiMethod .
Recibo el error Error: Error: Invalid arguments for async.retry
¿Cómo lo implemento para que todos los errores se registren cada vez que falla y también cómo salir con éxito del ciclo de 60 reintentos si tiene éxito antes de que finalicen los 60? (si termina en, por ejemplo, 14, detenga los reintentos).
Puede probar la biblioteca de reintento asíncrono .
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, } );Como puedo ver, se supone que apiMethod es una promesa no resuelta, prueba esto
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;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)); } }No pude averiguar cómo hacerlo con la biblioteca asíncrona, pero esto funcionó para sondear en mi situación en la que se arrojaría el error y esperaría un segundo cuando la transacción aún no se haya procesado y luego se vuelva a intentar.