Muchas veces me he preguntado sobre esto, ya que puede llevar al problema obvio:
function someFunction (a, b) { return a + b } Si a es una promesa, primero deberá resolverla:
async function someFunction (a, b) { a = await a return a + b } Lo que a confusión sobre si se resuelve o no ...
Sí, generalmente se debe evitar pasar promesas a funciones. Prefiero esperar la promesa y pasar solo el resultado, es decir, hacer
somethingAsync().then(x => someFunction(x, y)) // or someFunction(await somethingAsync(), y)en vez de
someFunction(somethingAsync(), y) Como usted dice, de lo contrario es muy confuso, especialmente cuando no usa TypeScript para decirle cuándo se ha equivocado. Y la implementación de someFunction se vuelve mucho más simple cuando es síncrona y no tiene que lidiar con ninguna lógica asíncrona, lo que también la hace más universalmente útil.
Por supuesto, hay excepciones a cada regla, y serían funciones que están explícitamente dedicadas a manejar la lógica de promesa asíncrona, como Promise.resolve , Promise.all , Promise.race , .then() , etc. A veces escribes funciones auxiliares similares usted mismo, por ejemplo, para el manejo de errores, y en esos casos podría ser aceptable pasar una promesa. Aunque todavía es inusual.