【发布时间】:2017-11-22 19:29:31
【问题描述】:
我创建了一种机制,让其他服务可以向主通信服务注册自己。这样通信服务就可以将消息分派给目标服务或目标组件。在这种机制中,我允许传入一个 id
public 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) 由于某种原因,未通过所记录的订阅的特定下一个功能。
最后一点,我不知道为什么这没有通过。没有错误,因此创建了主题并调用了下一个,但该函数永远不会像我预期的那样执行。
**EDIT - 我还从调试中看到主题上的observers 数组是空的。因此,当我订阅时,我希望该数组中至少有 1 个元素。根据我的假设,我怀疑订阅不起作用,因此它确实执行了下一个操作,但数组中没有订阅者,它不会去任何地方。不知道为什么当我使用 next 传递匿名对象时订阅没有添加观察者。
【问题讨论】:
标签: angular typescript rxjs