введение
Когда асинхронные операции не выполняются, повторение может быть эффективной стратегией для обработки преобразовательных ошибок. В этой статье представлены различные шаблоны для повторной операции на основе обещаний, сосредоточившись на трех общих сценариях. Он определяет задержку между повторными и максимальным количеством попыток. вернуть новое обещание (function (Resolve, отклонить) { var ошибка; var попытка = function () { if (times == 0) { отклонить (ошибка); } еще { fn (). Тогда (Resolve) .catch (function (e) { раз ...; ошибка = E; setTimeout (function () {tring ()}, dolement); }); } }; пытаться(); }); }. Он определяет задержку между повторными поисками и максимальным количеством попыток. .then (function (результат) { вернуть новое обещание (function (Resolve, отклонить) { var extralid = setInterval (function () { work.requeststatus (результат) .then (function (result2) { Switch (result2.status) { Дело «прогресс»: перерыв; // ничего не делать Случай "успех": clearInterval (extralid); решимость (результат2); перерыв; случай "сбой": clearInterval (extralid); отклонить (результат2); перерыв; } }). Catch (function (erron) {clearInterval (extralid); отклонить (ошибку)}); }, 1000); }); }) .Then (function () {console.log ('dode')}) .catch (console.error);
шаблон #3: Unlimited Retry с условием
Этот шаблон обеспечивает эффективный способ повторного ограниченного времени. Он только указывает задержку между Retries.
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();
});
};
В отличие от приведенных выше шаблонов, этот подход создает цепочку .catch (), а не .Then (). Он ограничивает количество попыток и подходит для сценариев с низким максимумом, чтобы избежать чрезмерного потребления памяти.
decureDelay (sany) { вернуть новое обещание (function (Resolve, отклонить) { setTimeout (dize.bind (null, разум), t); }); }
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);
var max = 5;
var p = rapect.reject ();
for (var i = 0; i
function rejectDelay(reason) {
return new Promise(function(resolve, reject) {
setTimeout(reject.bind(null, reason), t);
});
}
var max = 5;
var p = rapect.reject ();
for (var i = 0; i
var max = 5;
var p = Promise.reject();
for(var i=0; i эти шаблоны предоставляют универсальные способы реализации логики повторного использования для асинхронных операций. Будь то использование цепочек .catch () или .Then () зависит от требований, таких как использование памяти и максимальное количество попыток. ]
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3