【问题标题】:Subject.next() not making it to observersSubject.next() 没有让观察者看到
【发布时间】: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


    【解决方案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;
    }
    

    【讨论】:

    • 这就是答案...grrrrrrr
    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多