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 中一切都是值,包括 null
和 undefined
。所以问题可能出在其他地方。
这就是您现在正在做的事情,并且在这两种情况下(当您取消注释第二个 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));
我有一个 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 中一切都是值,包括 null
和 undefined
。所以问题可能出在其他地方。
这就是您现在正在做的事情,并且在这两种情况下(当您取消注释第二个 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));