Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

119
Views
¿Cómo usar esperar con la función asíncrona sin crear una Promesa?

Sé que una función asíncrona devuelve una Promesa, así que pensé en reemplazar este código:

 const hi = function (delay) { return new Promise((resolve, reject) => { setTimeout(() => { console.log('hi'); resolve(); },delay) }); }; const bye = async () => { await hi(1000); await hi(1000); await hi(1000); await hi(1000); return 'bye'; }; bye().then((msg) => { console.log(msg); });

con este código:

 const hi = async (delay) => { setTimeout(() => { console.log('hi'); },delay); }; const bye = async () => { await hi(1000); await hi(1000); await hi(1000); await hi(1000); return 'bye'; }; bye().then((msg) => { console.log(msg); });

La única diferencia es que estoy usando una función asíncrona en lugar de una función que devuelve una Promesa, ya que una función asíncrona devuelve una promesa. Pero el segundo código tampoco funciona como esperaba. Simplemente console.logs bye inmediatamente y luego, después de 1s, console.logs 'hola' 4 veces. ¿Pueden por favor ayudarme a entender la razón detrás de esto?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Una diferencia importante en ambos ejemplos de código está relacionada con el valor de retorno de la función hi .

En el primer ejemplo de código, la función hi devuelve una promesa, mientras que en el segundo ejemplo de código, la función hi no devuelve explícitamente ningún valor; como resultado, la promesa devuelta por la función async se resuelve implícitamente con el valor de undefined sin esperar a que se ejecute la función de devolución de llamada de setTimeout .

Un objeto de promesa no hace que nada sea asíncrono; es solo un contenedor de una operación ya asíncrona y el objeto de promesa notifica si la operación asíncrona se completó con éxito o si falló.

En el primer ejemplo de código, tiene una promesa de contenedor alrededor de setTimeout . Esa promesa de envoltura no se cumple hasta que se llama a resolve desde dentro de la función de devolución de llamada de setTimeout .

En el segundo ejemplo de código, la promesa devuelta por la función async no se vincula automáticamente al código asíncrono dentro de la función.

Después de llamar a setTimeout , la ejecución del código llega al final de la función hi ; Como no hay una declaración de return explícita, la promesa devuelta por la función async se cumple con el valor de undefined . Esto sucede antes de que se llame a la función de devolución de llamada de setTimeout .

about 4 years ago · Juan Pablo Isaza Report

0

Lo que te confunde aquí es el setTimeout , tu await await hi( en realidad await , pero no hay nada que esperar, esa promesa se resolverá casi de inmediato y regresará, por lo que los 4 se ejecutarán casi instantáneamente, luego registrarán "adiós", luego, después de 1 segundo, su tiempo de espera se activará y console.log "hola".

about 4 years ago · Juan Pablo Isaza Report

0

Esta respuesta agrega información adicional a la proporcionada por Yousaf .

Para responder brevemente a su comentario:

Gracias por la explicación. ¿Hay alguna forma de escribir la función hola sin usar la palabra clave 'Promesa'?

La respuesta es no. Para convertir una función que usa una interfaz de devolución de llamada en una que usa una promesa, deberá crear manualmente una promesa en alguna parte. Las funciones que utilizan una interfaz más antigua (generalmente) no devuelven promesas, por lo tanto, no puede await . Solo puede await objetos que sean entonces posibles (es decir, tiene un "then" method ). Si await un valor u objeto que no sea posible, la declaración de await se ignora esencialmente.

MDN recomienda envolver los métodos de devolución de llamada en el nivel más bajo posible:

Creación de una promesa en torno a una antigua API de devolución de llamada

Una Promise se puede crear desde cero usando su constructor. Esto debería ser necesario solo para envolver API antiguas.

En un mundo ideal, todas las funciones asíncronas ya devolverían promesas. Desafortunadamente, algunas API aún esperan que las devoluciones de llamadas de éxito y/o falla se pasen de la manera anterior. El ejemplo más obvio es la función setTimeout() :

 setTimeout(() => saySomething("10 seconds passed"), 10*1000);

Mezclar devoluciones de llamadas y promesas de estilo antiguo es problemático. Si saySomething() falla o contiene un error de programación, nada lo detecta. setTimeout tiene la culpa de esto.

Afortunadamente, podemos envolver setTimeout en una promesa. La mejor práctica es envolver las funciones problemáticas en el nivel más bajo posible y luego nunca volver a llamarlas directamente:

 const wait = ms => new Promise(resolve => setTimeout(resolve, ms)); wait(10*1000).then(() => saySomething("10 seconds")).catch(failureCallback);

Básicamente, el constructor de promesas toma una función ejecutora que nos permite resolver o rechazar una promesa manualmente. Dado que setTimeout() realmente no falla, dejamos de lado el rechazo en este caso.

Si aplicara esta información a su situación, esto significa envolver la llamada setTimeout() dentro de un constructor Promise como se muestra arriba.

 // The only responsibility of this function is converting the old // callback interface, to a promise interface. function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }

Luego use esta nueva función en hi() en lugar de setTimeout() .

 async function hi(delay) { await wait(delay); console.log('hi'); }
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!