javascript promise async-await anti-patterns

javascript - ¿Qué hay de malo en esperar una cadena de promesas?



promise async-await (3)

Me dicen que esperar una cadena de promesas romperá las cosas en mi código.

No necesariamente, sus dos fragmentos de código funcionan de la misma manera (siempre que someFunction() realmente devuelva una promesa).

Qué importa cuál se use. ¿Qué peligros presenta el primer fragmento de código que el segundo no?

Es más difícil de entender y mantener, es confuso mezclar diferentes estilos. La confusión lleva a los insectos.

Considere que necesitaría agregar otra llamada de promesa en la ubicación de la llamada console.log() , o incluso un retorno condicional de la función. ¿Puede usar await en la devolución de llamada como en cualquier otra parte de la función? ¿Necesita return el resultado de la devolución de llamada en then , es posible return desde la función externa? Todas estas preguntas ni siquiera aparecen en el primer fragmento. Y si bien pueden responderse fácilmente para su ejemplo de juguete, puede que no sea tan fácil en código real con un flujo de control más complejo y anidado.

Así que deberías preferir el más conciso y limpio. Manténgase a la await de la coherencia , evite then en la async function s 1 .

1: Por supuesto, siempre hay una excepción a la regla. Yo diría que es más limpio usar el encadenamiento de promesa para el manejo de errores en algunos casos en los que usarías catch o el segundo, then callback.

Estoy trabajando en una aplicación Angular 6 y me han dicho que lo siguiente es un antipatrón:

await someFunction().then(result => { console.log(result); });

Me doy cuenta de que no tiene sentido esperar una cadena de promesas. Si alguna función () devuelve una promesa, no necesitas una cadena de promesa si la estás esperando. Puedes hacerlo:

const result = await someFunction(); console.log(result);

Pero me dicen que esperar una cadena de promesas puede causar errores o que romperá las cosas en mi código. Si el primer fragmento de código anterior hace lo mismo que el segundo fragmento, ¿qué importa cuál se utilice? ¿Qué peligros presenta el primer fragmento de código que el segundo no?


Bajo el capó, async / await es solo promesas.

Es decir, cuando tienes un código que parece:

const result = await myAsyncFunction(); console.log(result):

Eso es exactamente lo mismo que escribir:

myAsyncFunction().then(data => { const result = data; console.log(result); });

La razón entonces, que no debes mezclar async / .then y .then cadenas, es porque es confuso.

Es mejor elegir solo un estilo y atenerse a él.

Y mientras selecciona uno, también puede elegir async / await, es más comprensible.


Si su código devolvía una promesa en lugar de llamar a console.log , su primer ejemplo await , pero su segundo ejemplo no lo haría.

Cuando use async/await , detectará sus rechazos en try/catch bloques try/catch . Su código será menos anidado y más claro.

El uso then menudo resulta en un mayor anidamiento y es más difícil leer el código.

Puedes await cualquier cosa, ya sea que devuelva o no una promise . A veces, esta prueba de futuro llama a un método que algún día puede volverse asíncrono o simplemente devolver una promesa sin declarar asíncrono.

Las desventajas son la complejidad, el rendimiento y la compatibilidad, que palidecen en comparación con las ganancias.

Encuentro que si confía en el valor de retorno de una función después de llamarla, y eventualmente se vuelve asíncrono, decorar llamando a sus funciones le await para deleite de su corazón, ya sea que se encuentre o no asíncrono o devuelva una promesa.