如何在Node.js TypeScript中使用Async / Await等待来自TypeScript中的Event Emitter的事件

时间:2019-04-30 04:11:45

标签: javascript node.js typescript events async-await

我有一个在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 );
    });

}

然后触发这样的发射事件,

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 个答案:

答案 0 :(得分:1)

  

有人可以指出我要去哪里吗?

您有两个不同 EventEmitter个。一个EventEmitter上触发的事件不会触发其他事件。

更多代码审查

在相同的 EventEmitter上触发并监听。也就是说,Promise对于返回 multiple 次的事物不是正确的抽象。 Promise只能一次解析,而事件可以触发多次。建议按原样使用EventEmitter,或使用其他流抽象,例如Observable

答案 1 :(得分:1)

EventEmmitter(易记模式)和Promise(责任链模式),它们具有不同的义务。我看到您想同时使用它们。在您的情况下,这并非不可能,因为EventEmitter并非为链接观察者处理器而设计。仅使用简单的Promise和构建器。有一个很好的RxJS库,它提供了很多功能。它可以满足您的要求:使用同步/异步链接案例构建事件驱动的体系结构。