Rxjs订阅多次触发

时间:2019-02-15 10:02:18

标签: angular typescript rxjs angular-services

我的订阅被多次触发是非常神秘的-我不知道我的错误是什么-我在另一方法上遵循了相同的方法,但是没有多次触发

 @Injectable({
  providedIn: 'root'
})
export class CommonService {

  constructor() {
    this.getpatientId = this.bindPatientId.asObservable();
  }

  bindPatientId: Subject<number> = new Subject<number>();
  getpatientId: Observable<number>;

  setPatientId(patientId: number) {
    this.bindPatientId.next(patientId);
  }

  bindTabId: Subject<number> = new Subject<number>();
}

将新值设置为Subject

 toggleProfile(patientId: number) {
    this.commonService.setPatientId(patientId);
    this.route.navigate(['/endrolPatient']);
  }

从另一个组件听

ngOnInit() {
    this._common.getpatientId.subscribe(
      (res) => {
        this.patientID = res;
        console.log("console inside observable", this.patientID);
      });
}

在我的控制台中,当我通过123时-我得到console inside observable 123,但是在第一个观察者休息后,所有订阅都会翻倍,并在控制台中记录两次-请帮助我修复该问题

2 个答案:

答案 0 :(得分:3)

这可能是因为您的组件被破坏并再次创建。因此,当您的组件销毁时,您必须销毁所有订阅。您可以使用ngOnDestroy生命周期方法

代码:

class MyComponent implements OnInit, OnDestroy {

private sub: Subscription;

ngOnInit() {
    this.sub = this._common.getpatientId.subscribe(
      (res) => {
        this.patientID = res;
        console.log("console inside observable", this.patientID);
      });
}

ngOnDestroy(){
   this.sub.unsubscribe():
}

答案 1 :(得分:-1)

每当您对所有内容使用Subject时都要使用Behavior Subject,我前段时间也遇到了问题,但这对我有用!

 bindPatientId: Subject<number> = new BehaviourSubject<number>();
 bindTabId: Subject<number> = new BehaviourSubject<number>();

订阅后,它返回主题的最后一个值。常规可观察对象仅在收到onnext时触发 您还可以使用

import { take } from 'rxjs/operators';

然后添加

.pipe(
  take(1)

在订阅之前

在这里看看 https://www.learnrxjs.io/operators/filtering/take.html

希望这对您有帮助!