Promise Retry Design Patterns

Bearbeite

Pattern, die es weiterhin versuchen, bis das Versprechen erfüllt ist (mit Verzögerung und maxRetries).Muster, das es so lange wiederholt, bis die Bedingung für das Ergebnis erfüllt ist (mit Verzögerung und maxRetries).in speichereffizientes dynamisches Muster mit unbegrenzten Wiederholungsversuchen (Verzögerung vorgesehen

Code für # 1. Versucht es weiter, bis das Versprechen erfüllt ist (irgendwelche Verbesserungen der Community für die Sprache usw.?)

Promise.retry = function(fn, times, delay) {
    return new Promise(function(resolve, reject){
        var error;
        var attempt = function() {
            if (times == 0) {
                reject(error);
            } else {
                fn().then(resolve)
                    .catch(function(e){
                        times--;
                        error = e;
                        setTimeout(function(){attempt()}, delay);
                    });
            }
        };
        attempt();
    });
};

Verwende

work.getStatus()
    .then(function(result){ //retry, some glitch in the system
        return Promise.retry(work.unpublish.bind(work, result), 10, 2000);
    })
    .then(function(){console.log('done')})
    .catch(console.error);

Code für # 2 erneut versuchen, bis eine Bedingung auf dem @ erfüllt ithen auf wiederverwendbare Weise erhalten (der Zustand kann variieren).

work.publish()
    .then(function(result){
        return new Promise(function(resolve, reject){
            var intervalId = setInterval(function(){
                work.requestStatus(result).then(function(result2){
                    switch(result2.status) {
                        case "progress": break; //do nothing
                        case "success": clearInterval(intervalId); resolve(result2); break;
                        case "failure": clearInterval(intervalId); reject(result2); break;
                    }
                }).catch(function(error){clearInterval(intervalId); reject(error)});
            }, 1000);
        });
    })
    .then(function(){console.log('done')})
    .catch(console.error);

Antworten auf die Frage(12)

Ihre Antwort auf die Frage