Saltar al contenido

Diferencia entre `retorno en espera de promesa` y` retorno de promesa`

Solución:

La mayoría de las veces, no hay una diferencia observable entre return y return await. Ambas versiones de delay1Second tienen exactamente el mismo comportamiento observable (pero dependiendo de la implementación, el return await La versión podría usar un poco más de memoria porque una versión intermedia Promise podría crearse un objeto).

Sin embargo, como señaló @PitaJ, hay un caso en el que hay una diferencia: si el return o return await está anidado en un try-catch cuadra. Considere este ejemplo

async function rejectionWithReturnAwait () {
  try {
    return await Promise.reject(new Error())
  } catch (e) {
    return 'Saved!'
  }
}

async function rejectionWithReturn () {
  try {
    return Promise.reject(new Error())
  } catch (e) {
    return 'Saved!'
  }
}

En la primera versión, la función async espera la promesa rechazada antes de devolver su resultado, lo que hace que el rechazo se convierta en una excepción y la catch cláusula a alcanzar; por tanto, la función devolverá una promesa que se resuelve en la cadena "¡Guardado!".

Sin embargo, la segunda versión de la función devuelve la promesa rechazada directamente sin esperarlo dentro de la función async, lo que significa que el catch caso es no llamado y la persona que llama recibe el rechazo en su lugar.

Como se mencionó en otras respuestas, es probable que exista un ligero beneficio en el rendimiento al dejar que la promesa brote devolviéndola directamente, simplemente porque no tiene que esperar el resultado primero y luego envolverlo con otra promesa nuevamente. Sin embargo, nadie ha hablado de optimización de llamadas de cola todavía.

La optimización de llamadas de cola, o "llamadas de cola adecuadas", es una técnica que utiliza el intérprete para optimizar la pila de llamadas. Actualmente, no muchos tiempos de ejecución lo admiten todavía, aunque técnicamente es parte del estándar ES6, pero es posible que se agregue soporte en el futuro, por lo que puede prepararse para eso escribiendo un buen código en el presente.

En pocas palabras, TCO (o PTC) optimiza la pila de llamadas al no abriendo un nuevo marco para una función que es devuelta directamente por otra función. En cambio, reutiliza el mismo marco.

async function delay1Second() {
  return delay(1000);
}

Ya que delay() es devuelto directamente por delay1Second(), los tiempos de ejecución que admiten PTC primero abrirán un marco para delay1Second() (la función exterior), pero luego en lugar de abrir otro marco para delay() (la función interna), simplemente reutilizará el mismo marco que se abrió para la función externa. Esto optimiza la pila porque puede evitar una desbordamiento de pila (jeje) con funciones recursivas muy grandes, por ejemplo, fibonacci(5e+25). Esencialmente se convierte en un bucle, que es mucho más rápido.

PTC solo se habilita cuando la función interna está directamente regresó. No se usa cuando el resultado de la función se modifica antes de que se devuelva, por ejemplo, si tenía return (delay(1000) || null), o return await delay(1000).

Pero como dije, la mayoría de los tiempos de ejecución y los navegadores aún no son compatibles con PTC, por lo que probablemente no haga una gran diferencia ahora, pero no estaría de más preparar su código para el futuro.

Lea más en esta pregunta: Node.js: ¿Hay optimizaciones para las llamadas de cola en las funciones asíncronas?

Esta es una pregunta difícil de responder, porque depende en la práctica de cómo su transpilador (probablemente babel) realmente rinde async/await. Las cosas que están claras independientemente:

  • Ambas implementaciones deberían comportarse igual, aunque la primera implementación mayo tener uno menos Promise en la cadena.

  • Especialmente si dejas lo innecesario await, la segunda versión no requeriría ningún código adicional del transpilador, mientras que la primera sí.

Por lo tanto, desde una perspectiva de depuración y rendimiento del código, la segunda versión es preferible, aunque solo un poco, mientras que la primera versión tiene un ligero beneficio de legibilidad, ya que indica claramente que devuelve una promesa.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.