En JS, digamos que llamo a una promesa de una manera de 'disparar y olvidar'. No me importa si tuvo éxito o no, y no me importa lo que devuelva, ya que quiero devolver el mismo valor de todos modos.
puedo llamar
return myPromise().then(() => foo).catch(() => foo);
¿Hay alguna manera de no repetir then y catch partes?
Pensé en usar finally , pensando que tomará lo que finalmente regresa (similar a lo que hace Java al tomar el valor de retorno del bloque finalmente): return myPromise().finally(() => foo); Pero resulta que no hizo lo que esperaba. Según mdn , este valor de retorno se utilizará para rechazar en caso de que se rechace la promesa original.
Puede declarar su función de devolución de resultados una vez y luego reutilizarla dos veces para los .then() y .catch()
const myReturn = () => foo; return myPromise() .then(myReturn) .catch(myReturn); Puede acortar aún más esto usando ambos parámetros de .then() que manejan tanto la ruta de éxito como la de falla:
const myReturn = () => foo; return myPromise() .then(myReturn, myReturn);Si encuentra que necesita esto mucho, puede crear una pequeña función de biblioteca que tome un valor y devuelva dos funciones que simplemente se evalúan a él:
const doubleThunk = val => [() => val, () => val];Que se usaría así:
return myPromise() .then(...doubleThunk(foo));Podría echar un vistazo a Promise.allSettled si está apuntando a navegadores más nuevos o versiones de Node.js.
Esta función devolverá una Promesa que resuelve si la Promesa pasada se resuelve o rechaza.
function foo(results) { console.log('foo():', ...results) } // Success path Promise.allSettled([Promise.resolve('Yay')]).then(foo) // Failure path Promise.allSettled([Promise.reject('Doh')]).then(foo) .as-console-wrapper { max-height: 100% !important; }