¿Hay alguna implicación de usar Promise.prototype.catch dentro de las funciones asíncronas donde se usa await ?
Por ejemplo:
async funciton sendMessage(topic, bodyObj) { // implementation is not important } async function removeFromInventory(item, amount) { const storeData = await getSoreData(item) const removeResult = await inventory.removeFromStore(storeData.id, item.id, amount) sendMessage( Message.REMOVE_INVENTORY_SUCCESS, removeResult ).catch(log.error) // <== here, is it has downside and it is better to use try/catch? return removeResult } No quiero await a que se complete sendMessage y uso .catch para manejar los rechazos, en otras palabras, evitar los rechazos no manejados.
¿Hay alguna implicación de usar Promise.prototype.catch dentro de las funciones asíncronas donde se usa await?
La forma en que lo está usando, la implicación principal es que está "comiendo" el error. Registras el error y luego continúas como si no hubiera ningún error. Si esa es la intención del diseño, funcionará bien.
En cuanto al tema general, puede mezclar async/await .then() y .catch() . Funcionará, no hay ninguna prohibición de idioma en su contra.
Dicho esto, generalmente no se recomienda mezclarlos, ya que puede crear un código más confuso donde no está del todo claro si el manejo de errores y/o la propagación de errores se implementan de manera consistente y correcta porque está mezclando dos modelos diferentes de manejo de errores.
La única vez que tiendo a mezclar async/await await con .catch() es cuando quiero iniciar sesión y "comer" un error mientras dejo que todo lo demás continúe como si no hubiera ningún error.
Por ejemplo, eso sucede a menudo cuando se elimina un archivo temporal dentro de una función que de otro modo usa async/await :
fs.promises.unlink(tempFile).catch(err => console.log(err)); Lo hago de esta manera solo porque es más compacto que lo rodea con try/catch y estoy "comiendo" el error porque no hay nada útil que hacer si esto falla y la operación principal ya se completó con éxito. También es posible que no ponga una await porque en realidad no necesito que la operación principal espere a que se complete esta limpieza antes de que comunique su finalización.
A modo de comparación, la otra forma de hacer esto sería:
try { await fs.promises.unlink(tempFile); } catch(e) { console.log(e); } Entonces, si esa es su intención con sendMessage(...).catch() , entonces está perfectamente bien. Esto registrará el error y, de lo contrario, "comerá" el error para que el procesamiento continúe como si no hubiera ningún error.
Si, por otro lado, desea que el error se propague a la persona que llama, entonces esto no es lo que desea porque eso no sucederá. Este código maneja el error y lo oculta para que no se propague a la persona que llama.