AsyncSubject - 如何只获取一次数据?

时间:2017-10-30 09:42:10

标签: javascript angular rxjs observable

在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');

3 个答案:

答案 0 :(得分:0)

这是AsyncSubjectngOnInit()完全正常的行为。每当您订阅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;
  }
}