Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

281
Vistas
¿Cuándo se ejecuta el cuerpo de una Promesa?

Supongamos que tengo la siguiente Promise :

 function doSomethingAsynchronous() { return new Promise((resolve) => { const result = doSomeWork(); setTimeout(() => { resolve(result); }), 100); }); }

¿En qué momento se llama a doSomeWork() ? ¿Es inmediatamente después o mientras se construye la Promise ? Si no, ¿hay algo adicional que deba hacer explícitamente para asegurarme de que se ejecute el cuerpo de la Promise ?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Inmediatamente, eso sí, por especificación.

Desde el MDN :

La función ejecutora es ejecutada inmediatamente por la implementación de Promise, pasando funciones de resolución y rechazo (se llama al ejecutor antes de que el constructor de Promise devuelva el objeto creado)

Aquí está en la especificación ECMAScript (por supuesto, más difícil de leer...): http://www.ecma-international.org/ecma-262/6.0/#sec-promise-executor

Esta garantía puede ser importante, por ejemplo cuando estás preparando varias promesas que luego pasas a all o race , o cuando tus albaceas tienen efectos secundarios sincrónicos.

over 4 years ago · Santiago Trujillo Denunciar

0

Sí, cuando construyes una Promise , el primer parámetro se ejecuta inmediatamente.

En general, no usaría realmente una promise de la forma en que lo hizo, ya que con su implementación actual, seguiría siendo síncrona.

Preferiría implementarlo con un tiempo de espera, o llamar a la función de resolución como parte de una devolución de llamada ajax

 function doSomethingAsynchronous() { return new Promise((resolve) => { setTimeout(function() { const result = doSomeWork(); resolve(result); }, 0); }); }

El método setTimeout llamaría a la función en el siguiente momento posible en que la cola de eventos esté libre.

over 4 years ago · Santiago Trujillo Denunciar

0

Puede ver desde abajo que el cuerpo se ejecuta inmediatamente simplemente colocando código sincrónico en el cuerpo en lugar de asincrónico:

 function doSomethingAsynchronous() { return new Promise((resolve) => { console.log("a"); resolve("promise result"); }); } doSomethingAsynchronous();console.log("b");

El resultado muestra que el cuerpo de la promesa se ejecuta inmediatamente (antes de que se imprima 'b'):

 a b

El resultado de la Promesa se retiene, para ser liberado a una llamada 'entonces', por ejemplo:

 doSomethingAsynchronous().then(function(pr){console.log("c:"+pr);});console.log("b");

Resultado:

 a b c:promise result

Lo mismo ocurre con el código asíncrono en el cuerpo, excepto el retraso indeterminado antes de que se cumpla la promesa y se pueda llamar 'entonces' (punto 'c'). Por lo tanto, 'a' y 'b' se imprimirán tan pronto como regrese doSomethingAsynchronous() , pero 'c' aparecerá solo cuando se cumpla la promesa (se llama a 'resolve').

Lo que parece extraño en la superficie, una vez que se agrega la llamada a 'entonces', es que 'b' se imprime antes de 'c' incluso cuando todo está sincronizado. ¿Seguramente se imprimiría 'a', luego 'c' y finalmente 'b'? La razón por la que 'a', 'b' y 'c' se imprimen en ese orden es porque no importa si el código en el cuerpo es asíncrono o sincronizado, Promise siempre llama al método 'then' de forma asíncrona.

En mi mente, imagino que el método 'entonces' es invocado por algo como setTimeout(function(){then(pr);},0); en la Promesa una vez que se llama 'resolver'. Es decir, la ruta de ejecución actual debe completarse antes de que se ejecute la función pasada a 'entonces'.

No es obvio a partir de la especificación de Promise por qué hace esto. Supongo que garantiza un comportamiento coherente con respecto a cuándo se llama 'entonces' (siempre después de que finalice el hilo de ejecución actual), lo que presumiblemente permite apilar/encadenar varias Promises antes de iniciar todas las llamadas then en sucesión.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda