我已经为其他服务创建了一种机制来向主要通信服务注册自己。这使得通信服务可以将消息分派给目标服务或目标组件。在这个机制中,我允许在
中传递一个idpublic register(id : number) : Subject<HMessage>{
console.log("creating new subject named "+id);
let subject = Subject.create();
this.addToMap(subject,id);
return subject;
}
id仅基于枚举。
export enum MessageType{
AuthMessage,
DefMessage,
DeltaMessage,
KeepAliveMessage,
ServerLog,
}
这里我只是利用我在通信服务的NgInit
中初始化的地图。
this.map = new Map<number,Subject<HMessage>>();
当我处理要调度的传入消息时,它会存储在那里以便检索。
private processIncoming(message : HMessage){
console.log("Incoming>>>",message.type,message.data);
let subject = this.map.get(message.type);
if(subject){subject.next(message);}
else{console.log(message.type+" doesn't have a target subject available to receive the message!")}
}
我在不同的地方有几个控制台日志,以查看它的位置和未达到的位置。示例传入消息用于服务器日志,该日志在此处订阅已注册的主题:
this.register(MessageType.ServerLog).subscribe({ next: (message) => this.toConsole(message.data)});
该方法只输出消息的数据,在这种情况下只是一个字符串到控制台。
根据控制台日志,返回消息正常。它正在点击processIncomingMessage
所以在此之前的一切工作正常,这有助于特定的代码。
我在调试时注意到的事情:
1)我只在地图上添加1个主题。 2)我可以从地图上获取主题,然后我就可以打电话给它。 3)所述订阅的具体下一个功能由于某种原因未通过。
最后一点,我不知道为什么没有通过。没有错误所以创建了主题并且正在调用next但是函数永远不会像我期望的那样执行。
**编辑 - 我还从调试中看到主题上的observers
数组为空。因此,当我订阅时,我希望该数组中至少包含1个元素。基于我的假设,我怀疑订阅不起作用,因此它确实执行下一个操作,但是阵列中没有订户它不会去任何地方。当我传递一个带有next
的匿名对象时,不确定为什么订阅不添加观察者。
答案 0 :(得分:1)
Subject.create()
期望2个参数是观察者和观察者(docs)。我从来没有真正使用过Subject.create(),但我认为如果预定义的Subjects不符合您的需要,它可以构建您自己的Subject的自定义实现。在你的情况下,我相信基本的主题将起作用。所以你可以改变
public register(id : number) : Subject<HMessage>{
let subject = Subject.create();
this.addToMap(subject,id);
return subject;
}
到
public register(id : number) : Subject<HMessage>{
let subject = new Subject(); // change to basic subject
this.addToMap(subject,id);
return subject;
}