Promises: Repeat operation until it succeeds?

前端 未结 6 842
天命终不由人
天命终不由人 2020-11-30 08:28

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

6条回答
  •  眼角桃花
    2020-11-30 09:12

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

提交回复
热议问题