Estoy confundido. Soy nuevo en async, así que sé que me estoy perdiendo algo fundamental, pero me estoy rascando la cabeza. Por los ejemplos que he visto, pensé que tenía razón pero...
El siguiente código funciona bien cuando se burla. Sin embargo, cuando busco el objeto del tablero real de mongo, puedo ver que la ejecución no está en orden. Por lo tanto, el código que se basa en que hay un objeto de tablero falla debido a que no está definido.
Código relevante
router.get('/:id?', (req, res) => { getDashboardData(req) }) async function getDashboardData(req) { const dashboardId = await getDashboardId(req) const dashboard = await loadDashboard(dashboardId) const results = await showResults(dashboardId, dashboard) } async function getDashboardId(req) { dashboardId = req.params.id.trim() // Some other things happen here but ultimately we return a UUID return(dashboardId) } async function loadDashboardFromId (dashboardId) { Dashboard.findOne({dashboardId: dashboardId}).then((dashboard) => { if (dashboard == null || dashboard.dashboardId == null) { throw new Error('No dashboard matched in loadDashboardFromId for dashbardId: ' + dashboardId) } else { console.log('dashboard within loadDashboardFromId: ' + dashboard) return dashboard } }) } async function showResults(dashboardId, dashboard) { console.log("dashboardId: " + dashboardId) console.log("dashboard within showResults: " + dashboard) }Salida de la consola a continuación. Puede ver que showResults() se ejecuta antes de que loadDashboard() regrese:
connected to mongo server. open connection to mongo server. dashboardId: dbc7e954-c6a7-490f-8d9b-4dd11f11d262 dashboard within showResults: undefined dashboard within loadDashboardFromId: { _id: new ObjectId("6208f552a442468c65987e62"), dashboardId: 'dbc7e954-c6a7-490f-8d9b-4dd11f11d262', createdDate: 2022-02-13T00:00:00.000Z, surveyId: 'b55a58d6-63f1-473e-9a3c-34f5d63af499', participantId: '9b274cfe-68ea-4206-9f3c-f2ee309ec4de', personalityTotal: new Decimal128("69"), // etc }```No te mezcles then/catch y await . Usa uno u otro. Prefiero await :
async function loadDashboardFromId (dashboardId) { const dashboard = await Dashboard.findOne({dashboardId: dashboardId}) if (dashboard == null || dashboard.dashboardId == null) { throw new Error('No dashboard matched in loadDashboardFromId for dashbardId: ' + dashboardId) } else { console.log('dashboard within loadDashboardFromId: ' + dashboard) return dashboard } }Puede usar Promise... Para más documentaciónhttps://www.newline.co/fullstack-react/30-days-of-react/day-15/
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve
async function getDashboardData(req) { var dashboardId; var dashboard; var promise = new Promise(async function(resolve, reject) { dashboardId = await getDashboardId(req) dashboard = await loadDashboard(dashboardId) if(dashboardId && dashboard){ resolve(true); } }) const results = await showResults(dashboardId, dashboard) }