我的订阅被多次触发是非常神秘的-我不知道我的错误是什么-我在另一方法上遵循了相同的方法,但是没有多次触发
@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
,但是在第一个观察者休息后,所有订阅都会翻倍,并在控制台中记录两次-请帮助我修复该问题>
答案 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
希望这对您有帮助!