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.