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; } }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/
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.