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

243
Vistas
NodeJS, del encadenamiento de promesas al encadenamiento asíncrono/en espera

Con NodeJS version 16.14.0 , estoy tratando de migrar de una promise .then().catch a una administración async/await .
El problema es que con el primer método, pude encadenar múltiples funciones secuencialmente, con el mismo gran objeto pasado a través de cada una (con return resolve(bigObject) y cada función tomando como entrada el mismo bigObject ). Estaba haciendo esto porque puedo administrar microerrores dentro de los datos (por lo que no hay capturas involucradas), devolviendo al usuario una lista completa de errores:

 var commonData = { data1: ... data2: ... data3: ... data4: ... data5: ... data6: ... }; return function1(commonData) .then(function2) .then(function3) .then(function4) .then(function5) .then(function(result) { //Inside this .then, I'd have the "result" variable as result of the chain }) .catch(error => { return reject(error); });

¿Cómo puedo hacerlo con el sistema de espera asíncrono? Esto es lo que he probado hasta ahora:

 var commonData = { data1: ... data2: ... data3: ... data4: ... data5: ... data6: ... }; commonData = await function1(commonData); commonData = await function2(commonData); commonData = await function3(commonData); commonData = await function4(commonData); commonData = await function5(commonData); //I was expecting to have inside "commonData" the same situation //as "result" in the chain above

¿Hay otra forma de encadenar funciones con el mismo objeto grande que me falta?

EDITAR:
2 de las funciones que estoy usando en esta parte... están diseñadas de esta manera porque también están siendo llamadas en otras partes del archivo, no pude usarlas localmente

 //function 1 async function function1(commonData) { try { var data1 = await models.data1.findAll({where: {Domain_ID: [13,15]}}) data1.forEach(function(dat) { commonData.data1.push(dat.dataValues); }); return commonData; } catch (error) { throw error; } } //function2 async function function2(commonData) { try { var data2 = await models.data2.findAll(); data2.forEach(function(dat) { commonData.data2.push(dat.dataValues); }); return commonData; } catch (error) { throw error; } }
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

No, no hay otra manera. Una de las razones por las que se implementó Async/Await es que el encadenamiento de Promise puede verse bastante feo y desordenado. Si prefiere .then() , simplemente manténgalo en este módulo.

Para leer más: https://blog.logrocket.com/promise-chaining-is-dead-long-live-async-await-445897870abc/

about 4 years ago · Juan Pablo Isaza Denunciar

0

La forma en que lo tiene ( commonData = await function1(commonData) , etc.) está bien. Pero si no quiere hacer eso, puede anidar las llamadas:

 const result = await function5( await function4( await function3( await function2( await function1(commonData) ) ) ) );

O usa un bucle:

 let result = commonData; for (const fn of [function1, function2, function3, function4, function5]) { result = await fn(result); }

O podría seguir usando then . Aunque, en general, mezclar async / await con controladores de promesa explícitos a través .then / .catch es confuso, hay algunos momentos limitados en los que puede hacerlo:

 const result = await function1(commonData) .then(function2) .then(function3) .then(function4) .then(function5);

Funciona porque las funciones async son solo una forma de consumir y producir promesas.


O con la gran advertencia de que sabe que las funciones solo modifican el estado del objeto y no devuelven (cumplen su promesa con) un objeto diferente , podría hacer:

 await function1(commonData); await function2(commonData); await function3(commonData); await function4(commonData); const result = await function5(commonData);

pero es una gran advertencia.

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