Subject.next()没有通过观察者

时间:2017-11-22 19:29:32

标签: angular typescript rxjs

我已经为其他服务创建了一种机制来向主要通信服务注册自己。这使得通信服务可以将消息分派给目标服务或目标组件。在这个机制中,我允许在

中传递一个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)所述订阅的具体下一个功能由于某种原因未通过。

最后一点,我不知道为什么没有通过。没有错误所以创建了主题并且正在调用next但是函数永远不会像我期望的那样执行。

**编辑 - 我还从调试中看到主题上的observers数组为空。因此,当我订阅时,我希望该数组中至少包含1个元素。基于我的假设,我怀疑订阅不起作用,因此它确实执行下一个操作,但是阵列中没有订户它不会去任何地方。当我传递一个带有next的匿名对象时,不确定为什么订阅不添加观察者。

1 个答案:

答案 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;
}