Как ожидать события от Event Emitter в машинописи, используя async / await в машинописи nodejs - PullRequest
1 голос
/ 30 апреля 2019

У меня есть приложение для машинописи, работающее на NodeJS, где я использую класс Event Emitter для отправки события при изменении значения переменной.

Я хочу дождаться, чтобы событие продолжалось, и, следовательно,Мне нужно вызвать ожидание в моем коде машинописи.

Это то, что я делаю,

if (StreamManagement.instance.activeStreams.get(streamObj.streamContext).streamState === 'Paused') {
     await StreamManagement.instance.waitForStreamActive(streamObj);
}

Это мой метод waitForStreamActive,

public async waitForStreamActive(stream: Stream) {
    const eventEmitter = new EventEmitter();

    return new Promise(( resolve ) => {
      eventEmitter.on('resume', resolve );
    });

}

И явызвать событие emit следующим образом:

public async updateStream(streamContext: string, state: boolean): Promise<string> {
    const eventEmitter = new EventEmitter();
    if (state === Resume) {
      const streamState = StreamManagement.instance.activeStreams.get(streamContext).streamState = 'Active';
      eventEmitter.emit('resume');
      return streamState;
    }
 }

Все эти три фрагмента кода находятся в разных классах и в разных файлах.

Этот фрагмент кода, похоже, не работает так, как я ожидал.

Я хочу добиться ожидания в javascript, пока обещание не будет выполнено.До тех пор, пока состояние не изменится на возобновление.

Может кто-нибудь указать мне, где я иду не так?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

EventEmmitter (шаблон Obserbable) и Promise (шаблон Chain of ответственность), у них разные обязательства.Я вижу, что вы хотите использовать их обоих.В вашем случае это не невозможно, потому что EventEmitter не предназначен для цепочки процессоров-наблюдателей.Используйте только простые обещания и застройщиков.Есть очень хорошая библиотека RxJS, она предоставляет множество функциональных возможностей.Он может делать то, что вы просите: создавать управляемую событиями архитектуру с синхронизированными / асинхронными цепочками.

1 голос
/ 30 апреля 2019

Может кто-нибудь указать мне, где я иду не так?

У вас есть два разных EventEmitter с.События, вызванные одним EventEmitter , не запускают другие.

Подробнее Code Review

Будет работать и прослушивание того же EventEmitter.Тем не менее, Promise не является правильной абстракцией для вещей, которые возвращают кратное раз.Promise может быть разрешено только один раз , тогда как События могут запускаться несколько раз.Предложите использовать EventEmitter как есть или альтернативно использовать другую потоковую абстракцию, например Observable ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...