Rx.ReplaySubject订阅回调未被调用

5
我有一个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无关。我记不清具体情况了,但是它使得条件永远不为真。这导致代码无法执行。


该HTTP是否已订阅? - Suraj Rao
如果(!window.Something),你确定这个条件在你的情况下通过了吗? - Aravind
@suraj 是的。HTTP部分实际上是有效的。问题出在if语句的第一部分。 - Jason
1个回答

1
使用.next(null)在任何Observable上都是正确的。在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


好的。我会继续寻找。我本来以为if语句的第一部分应该能够工作,因为else语句可以,但是目前我还无法解决。谢谢。 - Jason
这是我犯的一个愚蠢错误。感谢您抽出时间来。 - Jason
2
@Jason,你能否更新一下你的问题并说明你的错误? - mcabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接