En mi módulo de controlador tengo una función httpAddNewLaunch que invoca en la solicitud POST:
async function httpAddNewLaunch(req, res) { let launch = req.body addNewLaunch(launch) console.log(launch) return res.status(201).json(launch) }Función AddNewLaunch:
async function addNewLaunch(launch) { launch.flightNumber = (await launchesDataBase.findOne({})).flightNumber + 1 console.log(launch) await saveLaunch(launch) // launches.set(launch.flightNumber, launch) }función saveLaunch:
async function saveLaunch(launch) { await launchesDataBase.findOneAndReplace({ flightNumber: launch.flightNumber }, launch, { upsert: true }) } Cuando se invoca la función httpAddNewLaunch , no espera hasta que finalicen otras funciones que invoca (addNewLaunch(launch) -> saveLaunch(launch)), simplemente continúa ejecutándose, así que cuando console.log(launch) después de llamar a addNewLaunch(launch) registra un objeto sin número de vuelo .
Pero luego agrego await antes de addNewLaunch(launch), agrega el número de vuelo.
¿Por qué funciona de esa manera, si las funciones asíncronas son solo funciones que devuelven una Promesa, pero se ejecutan como funciones normales, por lo que deben ejecutarse en el orden en que fueron invocadas, pero en mi caso no espera y solo consola? registros (lanzamiento) sin número de vuelo?
¿Puedes explicarme dónde me equivoco? :)
Sugiero leer sobre cómo funcionan Promises y async/await . Hay muchas buenas guías/explicaciones, que probablemente deberías haber leído antes de comenzar a usarlas.
Básicamente, las funciones JS ejecutan declaración por declaración. La palabra clave await básicamente pone esto en su cabeza: su llamada de función actual se "pausará" hasta que se resuelva la Promesa dada. Y si se rechaza, su await promise se lanzará en su lugar. Ese es el objetivo de una función async : poder "pausar la llamada a la función" mientras se await el cumplimiento de otra promesa.
Una función asíncrona esencialmente devuelve una promesa. Por lo tanto, cuando llama a addNewLaunch(launch) sin esperar, la promesa se resuelve/rechaza pero no está esperando la respuesta. Agregue await para "esperar" a que finalice la promesa.
await addNewLaunch(launch);