Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Promises: Repeat operation until it succeeds?

Tags:

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?

like image 620
Jay Bienvenu Avatar asked Nov 01 '14 23:11

Jay Bienvenu


1 Answers

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 :)

like image 183
Benjamin Gruenbaum Avatar answered Nov 07 '22 23:11

Benjamin Gruenbaum