Javascript RxJS:如何在嵌套订阅调用之间组织订阅
在我的Angular应用程序中,我进行了以下处理:Javascript RxJS:如何在嵌套订阅调用之间组织订阅,javascript,angular,typescript,rxjs,observable,Javascript,Angular,Typescript,Rxjs,Observable,在我的Angular应用程序中,我进行了以下处理: OnInit从主题调用启动子主题(SubjectOne) 当有新的数据来自SubjectOne时 如果某些条件得到证实;我重新使用这些数据来启动第二个调用,这是来自服务调用的http调用 这是我的密码 MyComponent.ts: ngOnInit() { this.getFirstTreatment(); } getFirstTreatment() { this.subscriptionOne = th
- OnInit从主题调用启动子主题(SubjectOne)
- 当有新的数据来自SubjectOne时 如果某些条件得到证实;我重新使用这些数据来启动第二个调用,这是来自服务调用的http调用
ngOnInit() {
this.getFirstTreatment();
}
getFirstTreatment() {
this.subscriptionOne = this.myService.subjectOne.subscribe((data) => {
this.myValue = data['myValue'];
this.getSecondTreatment(data['myValue'])
})
}
getSecondTreatment(thatValue) {
if(thatValue >= 100){
this.subscriptionTwo = this.myService.sendToBackend(thatValue).subscribe((response)=>{}
}
}
MyService.ts
sendToBackend(thatValue){
let newValue = someFormatingnMethod(thatValue)
return this.httpClient.post(url , newValue );
}
我的目的是如何动态关闭SubscriptionTwo,使其在每次从主题获得新数据后不会被调用n次
NB:mySubject甚至在销毁组件之前就可以注意到一些新数据
我曾尝试使用开关映射
,但它似乎无法正常工作
建议?- 你从一个可观察的开始
- 在发出值后,可观察对象保持打开状态,因此我们需要取消订阅
- 然后,您希望根据第一个可观察的结果有条件地运行第二个可观察的
- 按照您当前的操作设置您的第一个可观察对象
- 使用
在销毁时取消订阅takeUntil
- 使用
仅根据条件继续filter
- 使用
运行第二个可观察的switchMap
- 第二个可观察到的是一个
请求,它自行完成,因此我们不需要取消订阅HttpClient
private$=新主题();
恩戈尼尼特(){
getFirstTreatment();
}
恩贡德斯特罗(){
this.destromed$.next();
此.complete$.complete();
}
getFirstTreatment(){
this.myService.subjectOne.pipe(
takeUntil(这个.被毁的$),
轻触(data=>this.myValue=data['myValue']),
过滤器(数据=>数据['myValue']>=100),
switchMap(数据=>this.getSecondTreatment(数据['myValue']))
).订阅(数据=>{
console.log(data);//第二个可观察对象的输出
});
}
GetSecond治疗(myValue):可观察{
返回此.getSecondTreatment(myValue);
}
为什么需要这个.complete$.complete()代码>?有必要吗?很好的解释。不要忘记订阅,因为第二个可观察到的-HttpClient请求是冷可观察的-检查至少完成主题是一个好的实践。我假设垃圾收集会像清理任何其他对象一样清理未引用的主题,但我不确定。由于getFirstTreatment回调仍然是recalled@firasKoubaa“召回”是什么意思?顺便说一句,我意识到我打错了-我忘了将arg添加到getSecondTreatment
。我已经在答案中修正了它。