Búsqueda de sitios web

javascript - ¿Cómo evitar la duplicación de lógica al promisificar métodos de js?


Recientemente adopté el patrón de encadenamiento de promesas. Es muy conveniente hacerlo así:

action1
.then(()=> action2())
.then(()=> action3());

Pero, para hacerlo cambié todos mis métodos así (TypeScript):

action1() : Promise<any>{
  try{
     // actual code
     return Promise.resolve();
  } catch (err){
     console.error(err);
     return Promise.reject(err);
  }
}

Esto parece un patrón muy repetitivo. ¿Cuál es la mejor manera de evitar la duplicación de código?

Respuesta #1

Escribe una función para envolver una promesa sobre una función y puedes reutilizarla

wrapPromise(fun) : Promise<any>{
  try{
     var value = fun()
     return Promise.resolve(value);
  } catch (err){
     console.error(err);
     return Promise.reject(err);
  }
}


wrapPromise(action1).then()

Respuesta #2

Dado que estás usando TypeScript, querrás usar async/await. Simplemente haz

async action1(): Promise<any>{
  try {
     return // actual code;
  } catch (err){
     console.error(err);
     throw err;
  }
}

Sin embargo, hay una buena posibilidad de que en realidad no quieras capturar, registrar y volver a lanzar todos los errores en cada función, así que esto se simplifica a

async action1(): Promise<any>{
  return // actual code;
}