I want to perform an operation repeatedly, with an increasing timeout between each operation, until it succeeds or a certain amount of time elapses. How do I structure this with promises in Q?
All the answers here are really complicated in my opinion. Kos has the right idea but you can shorten the code by writing more idiomatic promise code:
function retry(operation, delay) { return operation().catch(function(reason) { return Q.delay(delay).then(retry.bind(null, operation, delay * 2)); }); }
And with comments:
function retry(operation, delay) { return operation(). // run the operation catch(function(reason) { // if it fails return Q.delay(delay). // delay // retry with more time then(retry.bind(null, operation, delay * 2)); }); }
If you want to time it out after a certain time (let's say 10 seconds , you can simply do:
var promise = retry(operation, 1000).timeout(10000);
That functionality is built right into Q, no need to reinvent it :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With