es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Funcionalidad de reintento en cadena de promesas.

Tengo una cadena de promesas. Si recibo un error en getServiceCost, quiero repetir la cadena (reintentar) 2 veces. ¿Cómo puedo lograr esto al usar la cadena Promise, es decir, volver a ejecutar getUser, getServiceCost?

function getUser(userId) {
return new Promise((resolve, reject) => {
console.log(‘Obtener el usuario de la base de datos.’);
setTimeout(() => {
resolve({
userId: userId,
username: ‘admin’
});
}, 1000);
})
}

function getServices(user) {
return new Promise((resolve, reject) => {
console.log(Obtener los servicios de ${user.username} desde la API.);
setTimeout(() => {
resolve([‘Email’, ‘VPN’, ‘CDN’]);
}, 3 * 1000);
});
}

function getServiceCost(services) {
return new Promise((resolve, reject) => {
console.log(Calcular el costo del servicio de ${services}.);
setTimeout(() => {
if (services.includes(‘Error’)) {
reject(‘Ocurrió un error en getServiceCost.’);
}
resolve(services.length * 100);
}, 2 * 1000);
});
}

getUser(100)
.then(getServices)
.then(getServiceCost)
.then(console.log)
.catch(error => {
console.log(error);
console.log(‘Reintentar la cadena de promesas.’);
return getUser(100)
.then(getServices)
.then(getServiceCost)
.then(console.log)
.catch(error => {
console.log(error);
console.log(‘Reintentar la cadena de promesas.’);
return getUser(100)
.then(getServices)
.then(getServiceCost)
.then(console.log)
.catch(error => {
console.log(error);
console.log(‘La cadena de promesas falló después de 3 intentos.’);
});
});
});

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es usar el método Promise.retry(), que no forma parte de la API estándar de Promise, pero que se puede implementar como se muestra a continuación:

    Promise.retry = (promiseFn, retries) =>
      promiseFn().catch((error) =>
        retries > 0
          ? Promise.retry(promiseFn, retries - 1)
          : Promise.reject(error)
      );
    
    Promise.retry(() => getUser(100)
      .then(getServices)
      .then(getServiceCost), 2)
      .then(console.log);
    

    Aquí definimos una función Promise.retry() que toma una función de promesa y el número de reintentos como argumentos. Cuando se llama, ejecuta la función de promesa y si falla (es decir, es rechazada), vuelve a intentar la función hasta el número especificado de veces. Si se agotan los reintentos, rechaza la cadena de promesas con el error.

    Luego envolvemos la cadena de promesas original dentro de la llamada a la función Promise.retry() y le pasamos las funciones getUser, getServices y getServiceCost. También especificamos que queremos 2 reintentos en caso de que falle la función getServiceCost.

    Tenga en cuenta que esta implementación asume que la función getServiceCost arroja un error cuando falla. Si devuelve una promesa rechazada, es posible que deba modificar el código para manejar ese caso.

Comments are closed.