"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo implementar los patrones de diseño de reintento de promesa para el manejo de errores transitorios?

¿Cómo implementar los patrones de diseño de reintento de promesa para el manejo de errores transitorios?

Publicado el 2025-03-23
Navegar:396

How to Implement Promise Retry Design Patterns for Transient Error Handling?

promete volver a intentar los patrones de diseño

introducción

cuando las operaciones asíncronas fallan, el retintino puede ser una estrategia efectiva para manejar errores transitorios. Este artículo presenta varios patrones para volver a intentar las operaciones basadas en la promesa, centrándose en tres escenarios comunes.

Patrón #1: Vuelva a intentar hasta que la promesa se resuelva

Este patrón vuelve continuamente una promesa hasta que se resuelva con éxito. Especifica un retraso entre reintentos y un número máximo de intentos.

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();
    });
};

Patrón #2: Vuelva a intentar hasta que la condición se reúna

este patrón se reponga hasta que se cumpla una condición en el resultado de la promesa. Especifica un retraso entre reintentos y un número máximo de intentos.

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

patrón #3: reintento ilimitado con condición

Este patrón proporciona una forma eficiente en memoria de volver a intentarlo. Solo especifica un retraso entre reintentos.

enfoque alternativo usando .catch () cadenas

a diferencia de los patrones anteriores, este enfoque construye una cadena .catch (), no una cadena .then (). Limita el número de intentos y es adecuado para escenarios de bajo máximo para evitar el consumo de memoria excesivo.

function rejectDelay(reason) {
    return new Promise(function(resolve, reject) {
        setTimeout(reject.bind(null, reason), t); 
    });
}

reintentar hasta que se resuelva, con demora

var max = 5;
var p = Promise.reject();

for(var i=0; i 

hasta que la condición se reúna, sin demora

var max = 5;
var p = Promise.reject();

for(var i=0; i 

hasta que la condición se reúna, con demora

var max = 5;
var p = Promise.reject();

for(var i=0; i 

Conclusión

Estos patrones proporcionan formas versátiles de implementar la lógica de reintento para operaciones asíncronas. Si usando las cadenas .catch () o .then () depende de los requisitos, como el uso de la memoria y el número máximo de intentos.

Declaración de liberación Este artículo se reproduce en: 1729587561 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3