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 vorgesehenCode 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);