tengo tres funciones
async function inventories() { print("starting inventories") sleepFor(5000) // Here I am querying a mongodb database const inventoriesRes = await db.inventories.find({}) return inventoriesRes } async function costs() { print("starting costs") const costsRes = await db.costs.find({}) return costsRes } async function users() { print("starting users") const users = await db.users.find({}) return usersRes }Deseo :
aquí está mi solución
const dbqueries = async () => { const [result1, result2, result3] = await Promise.all([inventories(), costs(), users()]) return {result1, result2, result3} } dbqueries.then(results => { print(JSON.stringify(results)) }).catch(error => { throw error }); El problema es que no me funciona esta solución como yo quiero. Para verificar, puse un sueño (vea el código a continuación) en la función de inventories() . lo que pasa es
printing starting inventories waiting for 5 seconds printing costs printing usersEsto me dejó pensar que los costos () no comenzaron en paralelo. Si hubiera comenzado antes, habría
printing starting inventories printing costs printing users ... function sleepFor(sleepDuration){ var now = new Date().getTime(); while(new Date().getTime() < now + sleepDuration){ /* Do nothing */ } } O mi solución es incorrecta, o la función sleepFor está haciendo algo más que simplemente poner a dormir solo la función de inventories() . ¿Alguna ayuda?
PD. print funciona exactamente como console.log() en mongoshell, que es un intérprete JS completamente funcional
…o la función
sleepForestá haciendo algo más que simplemente poner a dormir solo la función deinventories()
Precisamente eso. Ha escrito una función de suspensión de bloqueo síncrona que detiene todo el programa. Lo ha llamado antes de cualquier await en la función, por lo que ni siquiera está durmiendo más tarde mientras el trabajo concurrente ya está en marcha, está durmiendo antes de que inventories() devuelva su promesa y las otras dos funciones puedan ser llamadas.
Su programa original funcionó como se esperaba. Para la verificación, debería haber agregado otra declaración de print para registrar cuando finaliza cada llamada a la base de datos:
async function inventories() { print("starting inventories") // Here I am querying a mongodb database const inventoriesRes = await db.inventories.find({}) print("finished inventories") return inventoriesRes }Recuerde que el código JS no se ejecuta en paralelo, en múltiples subprocesos ni nada. Todo lo que puede hacer es iniciar varias tareas asincrónicas (en su caso, las consultas de la base de datos), sin esperar inmediatamente a que finalice cada una. Más bien, los inicia todos, luego espera los resultados mientras hacen su trabajo al mismo tiempo.