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

127
Vistas
La clase JS Promise confunde los valores de retorno en el comportamiento encadenado

Por favor ayúdenme a entender el siguiente comportamiento de la clase Promise. He pasado mucho tiempo leyendo instrucciones y documentación, pero no puedo resolver esto por mí mismo.

 const promise = new Promise(resolver=> setTimeout(resolver("i am resolver"), 1000) ) .then(resolvedParameter => el => {console.log(el); console.log(resolvedParameter)}) .then(upperFunc => upperFunc("log me this")) .then(() => console.log("do not care about the others")) .catch(e => (error = e)); promise.then(()=>console.log("test"));

Esta es la salida de la consola:

registrame esto

soy resolutor

no te preocupes por los demás

prueba

En la Promesa donde se usa setTimeout no se especificó ningún valor de retorno, se devolvió la cadena "soy resolver" y se usó en el primer entonces (). Supongo que cuando llamas al resolver (como una función de resolución de promesas) devuelve el parámetro pasado para el siguiente entonces ()

En el primer entonces(), el parámetro resuelto se pasa en una función que devuelve una función que se devolverá y luego se usará en el segundo entonces(), que es lógico, y se recuerda la cadena de la primera promesa ("Soy resolver") y utilizado correctamente.

¿Puedes hacer una función entonces () con la función de resolución y rechazo? Por favor, ayúdenme a comprender qué formas tenemos disponibles para pasar datos de la primera promesa a la siguiente función, luego () y qué se espera que se devuelva desde la función entonces (). (Leí y entendí que son nuevas Promesas pero aún así el comportamiento es un poco difícil de entender)

Gracias por leer esta pregunta y cualquier idea es bienvenida.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Para obtener información general, aquí hay diferentes formas de hacer una promesa resuelta:

 promise = new Promise(resolver => resolver('any value')); promise = Promise.resolve('any value'); promise = Promise.resolve().then(() => 'any value'); promise = (async () => 'any value')()

Son funcionalmente equivalentes. Todos devuelven una promesa que se resuelve con el valor 'any value' .

La función .then() obtiene, como primer argumento, lo que se resolvió previamente en la cadena y puede devolver tres formas diferentes:

  1. Si devuelve un valor normal, se pasa a la cadena como el valor resuelto.
  2. Si arroja un valor, ese valor se transmite a la cadena como rechazo.
  3. Si devuelve una promesa[1], entonces lo que esa promesa resuelva o rechace se transmite a lo largo de la cadena como valor resuelto o rechazo.

Todos sus ejemplos caen en la primera categoría. Aquí hay una lista de valores transmitidos en las promesas resueltas:

 "i am resolver" el => {console.log(el); console.log(resolvedParameter)} undefined // because that is what the above function returns when called undefined // because that is what the console.log returns undefined // again console.log return value

Aquí hay un ejemplo en el que he envuelto todos sus valores de retorno dentro de promesas:

 const promise = new Promise(resolver=> resolver(Promise.resolve("i am resolver")); ) .then(resolvedParameter => Promise.resolve(el => {console.log(el); console.log(resolvedParameter)})) .then(upperFunc => Promise.resolve(upperFunc("log me this"))) .then(() => Promise.resolve(console.log("do not care about the others"))) .catch(e => Promise.resolve(error = e)); promise.then(()=>Promise.resolve(console.log("test")));

Esto funciona de manera idéntica a su ejemplo, pero espero que ahora quede claro qué se transmite en la cadena.

Como han mencionado otros, el segundo argumento de .then() se llama cuando se pasa el rechazo de la cadena. Funciona igual que el método .catch() . .then(undefined, someFunc) es lo mismo que .catch(someFunc) .

[1] Estrictamente, también puede ser un "thenable", algo que tiene un método then , pero ese es un caso especial.

about 4 years ago · Juan Pablo Isaza 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