Последние 2 дня мучаюсь с этим. Я хочу следить за изменениями в конкретной коллекции. Вся логика этих изменений выполняется асинхронно. Я попытался сделать функцию обратного вызова EventEmitter асинхронной, но по-прежнему работает синхронно.
Пример псевдокода:
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
});
Как я объяснил выше, я попробовал этот подход, но все равно работает синхронно. Второй функции обычно приходится ждать, пока первая функция завершит свою задачу, чтобы весь код работал правильно.
Обновлено: Из того, что я обнаружил, кажется, что функция обратного вызова сначала получает все эти объекты событий параметра «изменение», а затем выполняет код. На самом деле мне нужно выполнить код для каждого параметра события «изменить», а не для всех сразу.
@Molda Может быть, я плохо объяснил. Эти логические функции должны быть асинхронными, иначе ни один из кодов не будет работать должным образом. Проблема, которая у меня есть, заключается только в этом эмиттере событий, который выполняет функции одновременно, фактически не ожидая результата первого.
Что ж, someLogicFunction1 должен возвращать обещание, которое должно быть разрешено после того, как вся работа в нем будет выполнена. Невозможно помочь, не видя кода этой функции.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Одним из решений является заставить someLogicFunction1() возвращать обещание и вызывать someLogicFunction2(); в первой функции, например так:
await someLogicFunction1()
.then(function(){
someLogicFunction2();
});
Вам просто нужно изменить someLogicFunction1(); следующим образом:
someLogicFunction1( )
{
return new Promise( async function( resolve, reject ) {
// Do your stuff here
}); // eo promise
}
Не забудьте resolve() в функции someLogicFunction1.
resolve();
Вы также можете reject() в someLogicFunction1 и поймать ошибку при вызове этой функции.
reject();
Вы можете передать аргумент для разрешения и отклонения и получить его в своем вызове.
Я пробовал, но все равно не работает. В противном случае я обнаружил, что этот параметр «изменения» генератора событий обычно представляет собой только один объект, но он выполняет другую часть кода после получения или прохождения по циклу всех событий объектов события, хотя это асинхронная функция.
Можно точное "все равно не работает" в чем проблема?
Что ж, это была ошибка с моей стороны. Моя логика в этих функциях была немного неправильной. Вот почему он снова не работал. Но сейчас все работает, как и ожидалось, с вашим кодом. Большое спасибо за ваш ответ! :)
Тогда почему вы используете async/await, если хотите, чтобы ваш код был асинхронным?? Async/await используется, чтобы сделать ваш асинхронный код синхронным.