我有一个打字稿项目,可以完成一些工作。
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的轮询机制来检查作业状态更改,这是不理想的。
答案 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上并等待诺言得以解决的原因。
以上代码无法正常工作。
我在做错什么吗?