未调用Rx.ReplaySubject订阅回调

时间:2017-03-12 13:28:46

标签: angular rxjs rxjs5

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

我的假设是不会返回null值,因为它是在我订阅之前设置的,但我认为这是ReplaySubject的全部内容。我用谷歌搜索,直到我用不同的方式来解释这个问题,我得到的是ReplaySubject的read me文件。希望有人能告诉我我做错了什么。我想也许是因为我传入了null所以我传入了“你好”,但仍然没有。这是一个代码示例:

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无关。我不记得确切,但它正在制造,所以条件从来都不是真的。这使代码无法执行。

1 个答案:

答案 0 :(得分:1)

在任何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