Rx.ReplaySubject 订阅回调未被调用

Rx.ReplaySubject subscription callback not being called

我有一个 rxjs ReplaySubject,它会根据我所处的环境发出一个值或 null。意思是如果在某个环境中我进行服务调用并获取数据。如果我不在那个环境中,我只是在重播主题上调用 next(null)。如果进行了服务调用,在我订阅的组件中一切正常。如果我做了 next(null) 那么我的回调永远不会被触发。

我的假设是不会返回 null 值,因为它是在我订阅之前设置的,但我认为这就是 ReplaySubject 的全部意义所在。然后我用谷歌搜索,直到我 运行 用不同的方式来解释这个问题,我得到的只是 ReplaySubject 的自述文件。希望有人能告诉我我做错了什么。我想也许是因为我传入了 null 所以我传入了 "Hello" 而仍然没有。这是一个代码示例:

public Data = new ReplaySubject<any>(1);
init(){
 if(!window.Something){
   //subscribe callback is never fired in this case.
   this.Data.next(null);
 }else{
    this.http.get(...).map(...{
     //this works 
     this.Data.next(result);
    });
 }}

我犯的错误其实和Rx无关。我记不清了,但它正在发生,所以情况从来都不是真的。这使代码无法执行。

在任何 Observable 上使用 .next(null) 都是正确的。在 RxJS 中一切都是值,包括 nullundefined。所以问题可能出在其他地方。

这就是您现在正在做的事情,并且在这两种情况下(当您取消注释第二个 if 时)它都可以正常工作。该值存储在 ReplaySubject 中,然后重播或直接推送给当前观察者:

let subject = new ReplaySubject(1);

// if (!window.document) {
if (!window.whatever) {
  subject.next(null);
} else {
  setTimeout(() => {
    subject.next('Hello');
  }, 500);
}

subject.subscribe(val => console.log(val));

观看现场演示:https://jsbin.com/cigocak/edit?js,console