如何在打字稿中的变量值更改时触发事件-nodejs

时间:2019-04-26 12:49:08

标签: node.js typescript events

我有一个打字稿项目,可以完成一些工作。

export class Job {
  public jobState: 'Active' | 'Completed' | 'Paused' | 'Cancelled';
  public jobId: string;
}

我有一个地图对象,该对象是活动作业的列表,

private static jobStreams: Map<string, Job> = new Map();

在我的代码中,我需要在作业状态发生变化时得到通知,例如用户选择“暂停”作业时,

将对应的地图对象状态设置为“已暂停”,

jobStreams.set(job.jobId).jobState = 'Paused';

我想知道当工作状态改变时如何触发事件吗?

我将在工作上做一些活动,当工作暂停时,我应该能够得到一个使我联想到工作状态变化的事件,以便我可以停止所有处理。

我可以在用例中使用Typescript和nodejs中的某些事件处理机制吗?

现在,我正在使用一种使用setTimeout的轮询机制来检查作业状态更改,这是不理想的。

2 个答案:

答案 0 :(得分:2)

您可以通过扩展EventEmitter并在设置值时发出事件来手动触发事件:

setJob(job) {
  jobStreams.set(job.jobId).jobState = 'Paused';
  this.emit('job-paused', job);
}

或使用诸如MobX之类的反应性系统来观察状态和反应性变化。

尽管在实践中反应性系统更容易,但是您将需要发布状态更改并在服务器之间进行订阅(如果您有多个实例,该情况如何)。

这通常是通过消息代理(例如Kafka)或发布订阅系统(例如Redis pub-sub)完成的。

答案 1 :(得分:0)

我尝试了以下

在一个文件中,例如发射器。我发出一个事件,

import * as EventEmitter from 'events';
public async updateStream(streamContext: string, state: boolean): Promise<string> {
    const eventEmitter = new EventEmitter();
    if (state === resume) {
       eventEmitter.emit('resume');
    }
  }

在另一个文件中,我以诺言方式订阅了一个事件,

public async waitForStreamResume(stream: Stream) {

    const eventEmitter = new EventEmitter();

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

我将上面的方法称为

if (StreamManagement.instance.activeStreams.get
              (streamObj.streamContext).streamState === 'Paused') {

              await StreamManagement.instance.waitForStreamActive(streamObj);


            }

我想等到状态变为“恢复”,这就是为什么我将其包裹在Promise上并等待诺言得以解决的原因。

以上代码无法正常工作。

我在做错什么吗?