Durante los últimos 2 días he estado luchando con esto. Quiero estar atento a los cambios en una colección en particular. Toda la lógica de estos cambios es asíncrona. Traté de hacer que la función de devolución de llamada de EventEmitter fuera asíncrona, pero aún funciona de manera síncrona.
Ejemplo de pseudocódigo:
const someLogicFunction1 = async () => { // some logic here } const someLogicFunction2 = async () => { // some logic here } const collectionEventEmitter = Collection.watch(); collectionEventEmitter.on('change', async (change) => { await someLogicFunction1(); await someLogicFunction2(); // has to wait for first function to finish });Como expliqué anteriormente, probé este enfoque pero aún se ejecuta de forma sincrónica. La segunda función generalmente tiene que esperar a que la primera función termine su tarea para que todo el código funcione correctamente.
EDITAR: Por lo que he encontrado, parece que la función de devolución de llamada primero obtiene todos estos objetos de evento de parámetro de "cambio" y luego ejecuta el código. Lo que necesito en realidad es ejecutar el código para cada parámetro de evento de "cambio", no para todos a la vez.
Una solución es hacer que someLogicFunction1() devuelva una promesa y llame a someLogicFunction2(); en entonces de la primera función, así:
await someLogicFunction1() .then(function(){ someLogicFunction2(); }); Solo necesita modificar someLogicFunction1(); como esto:
someLogicFunction1( ) { return new Promise( async function( resolve, reject ) { // Do your stuff here }); // eo promise } No olvide resolve() en la función someLogicFunction1 .
resolve(); También puede reject() en someLogicFunction1 y detectar el error cuando llama a esta función.
reject();Puede pasar un argumento para resolver y rechazar y obtenerlo en su llamada.