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

88
Vistas
Rompecabezas de promesas

Estuve leyendo en un blog sobre Promises y muestran un problema que no entiendo en absoluto. El blog es: https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html .

El escritor presenta 4 acertijos con una solución gráfica:

Rompecabezas #1

 doSomething().then(function () { return doSomethingElse(); }).then(finalHandler);

Rompecabezas #2

 doSomething().then(function () { doSomethingElse(); }).then(finalHandler);

Rompecabezas #3

 doSomething().then(doSomethingElse()) .then(finalHandler);

Rompecabezas #4

 doSomething().then(doSomethingElse) .then(finalHandler);

Aquí doSomething() y doSomethingElse son promesas.

¿Alguien puede explicar todos los detalles? En el primero recibo la orden de ejecución. En el segundo, no entiendo por qué doSomethingElse y finalHandler comienzan y terminan al mismo tiempo. En el tercero, no entiendo por qué doSomething y doSomethingElse comienzan al mismo tiempo. ¿No debería doSomethingElse comenzar al final de doSomething? En cuarto, no consigo nada...

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

0

Rompecabezas 1

 // doSomething() is executed and returns a promise doSomething().then(function () { // when doSomething() executes successfully, execute doSomethingElse() and return the Promise return doSomethingElse(); }).then(finalHandler); // final handler will be executed once doSomethingElse has finished, since the promise was returned

Rompecabezas 2

 // doSomething() is executed and returns a promise doSomething().then(function () { // when doSomething() executes successfully, execute doSomethingElse() doSomethingElse(); // execute doSomethingElse() // since there is nothing returned here, the the promise will resolve immediatly, without waiting for doSomethingElse() to complete }).then(finalHandler); // final handler will be executed immediatly after doSomethingElse() has started to execute, without waiting for a result.

Rompecabezas 3

En este, ambas funciones comienzan al mismo tiempo porque .then espera una función como primer argumento. doSomethingElse es una función, pero doSomethingElse() es una llamada de función. Por lo tanto, se llama inmediatamente y .then() toma como primer argumento el valor de retorno de doSomethingElse , que es una promesa.

 doSomething().then(doSomethingElse()) .then(finalHandler);

Rompecabezas 4

A diferencia del rompecabezas 3, la función doSomethingElse se pasa a .then() , en lugar del valor de retorno de doSomethingElse en el rompecabezas 3. Esto significa que se llamará a doSomethingElse una vez que se haya hecho doSomething .

 // the code below is a shortcut for doSomething().then(() => doSomethingElse()) doSomething().then(doSomethingElse) .then(finalHandler);

Función frente a llamada de función

Lo que debe comprender es la diferencia entre una función ( doSomething ) y una llamada de función ( doSomething() ).

 function doSomething() { return "something"; } const func = doSomething; const value = doSomething(); console.log(func); console.log(value);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Los rompecabezas n.° 1 y n.° 4, así como los rompecabezas n.° 2 y n.° 3, son iguales.

En tu Rompecabezas #2, comienzas otra Promesa y regresas instantáneamente, sin esperarla. Por lo tanto, se llamará a su controlador final inmediatamente después de que se inició doSomethingElse, no después de que haya terminado. Si quieres eso, usa tu Rompecabezas #1

En su Rompecabezas n. ° 3, pasa la Promesa iniciada devuelta por doSomethingElse() directamente en lugar de decirle a js que llame a esa función si doSomething se resuelve. Si quieres hacerlo, escríbelo así; podría ayudar a evitar confusiones.

 doSomething() .then(() => doSomethingElse()) .then(() => finalHandler());
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