Javascript RxJS:如何在嵌套订阅调用之间组织订阅

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

在我的Angular应用程序中,我进行了以下处理:

  • OnInit从主题调用启动子主题(SubjectOne)

  • 当有新的数据来自SubjectOne时

    如果某些条件得到证实;我重新使用这些数据来启动第二个调用,这是来自服务调用的http调用

这是我的密码

MyComponent.ts:

  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
。我已经在答案中修正了它。