在Angular4中使用Rxjs发布问题
RxJS版本: 5.5.0
重现的代码:
服务
subject= new AsyncSubject<String>();
subject.next(data);
subject.complete();
组件
ngOnInit(){
subject.subscribe();
}
预期行为: 只接收一次数据,然后下一次清理数据,不再接收它或强制取消主体。
实际行为: 在服务中我有asyncSubject发出一些数据。在某些组件中,我订阅了我的asyncSubject,数据来自每个组件的初始化。我尝试取消订阅主题,但在下一次组件初始化后,它再次订阅。
其他信息: Angular版本4.4.6 Chrome版本61
DashboardComponent :
constructor(private userEvents: UserEvents,) {}
ngOnInit() {
this.successLogged();
}
successLogged() {
this.userEvents.successLoggedObservable.subscribe(message => {
console.log("WORK");
});
}
UserEvents :
private successLoggedObservable = new AsyncSubject<String>();
get successLogged() {
return this.successLoggedObservable;
}
LoginComponent :
this.userEvents.successLoggedObservable.next("MESSAGE");
this.userEvents.successLogged.complete();
this.stateService.go('dashboard');
答案 0 :(得分:0)
这是AsyncSubject
和ngOnInit()
完全正常的行为。每当您订阅AsyncSubject
时,它会发出最后一个发送给它的值,因此每次组件初始化时,它都会收到最后一个发射值。如果您想避免使用常规Subject
(或PublishSubject
。
来自官方文档的信息:ReactiveX Subject
答案 1 :(得分:0)
在组件
ReplaySubject(1)和publish()
,然后尝试connect()
// Service
const source = new Rx.ReplaySubject(1).publish()
source.next(1)
// source.complete() - not needed
// Simulate first subscribing component
const sub1 = source.subscribe(x => console.log('sub1', x))
source.connect()
// onDestroy
sub1.unsubscribe()
// Now resubscribe
const sub2 = source.subscribe(x => console.log('sub2', x))
source.connect()
// No value emitted
工作示例:CodePen
基本上,publish()
和connect()
会使可观察的热点,因此新订阅会在订阅时获取流。
不适用于AsyncSubject,但我还没弄清楚原因。
答案 2 :(得分:-1)
这是在每次加载中调用ngOnInit的常见行为。你可以创建bool变量,如果它已经加载了,则赋值false;
subscribed: Boolean = false;
ngOnInit() {
if (!subscribed) {
subject.subscribe();
this.subscribed = true;
}
}