Angular 第二次订阅不';t从RXJS中的第一个开关映射开始启动

Angular 第二次订阅不';t从RXJS中的第一个开关映射开始启动,angular,typescript,rxjs,switchmap,Angular,Typescript,Rxjs,Switchmap,我有这个工作代码。它从路由器获取ID,并将其作为参数应用于获取组件数据的加载 this.route.params.subscribe(_ => { this.id = _.id; this.service.getMineral(this.id) .subscribe(suc => this.data = suc, err => console.log(err)); } ); 然后,我尝试使用更好的方法,希望在第一个订阅完成时调用第二个订阅。根据,我应该分享

我有这个工作代码。它从路由器获取ID,并将其作为参数应用于获取组件数据的加载

this.route.params.subscribe(_ => {
  this.id = _.id;
  this.service.getMineral(this.id)
    .subscribe(suc => this.data = suc, err => console.log(err));
  }
);
然后,我尝试使用更好的方法,希望在第一个订阅完成时调用第二个订阅。根据,我应该分享第一个结果,然后切换map取消订阅,继续下一个结果。所以我实现了以下内容

const route$ = this.route.params.pipe(share());
const data$ = route$.pipe(
  switchMap(() => this.service.getMineral(this.id)));

route$.subscribe(_ => this.id = _.id);
data$.subscribe(suc => this.data = suc, err => console.log(err));
遗憾的是,这不会调用服务器,也不会向客户机发送数据。在尝试了几次修改后,由于缺乏想法,我放弃了


这两种方法的显著区别是什么?我在解释第二个样本时哪里会感到困惑?

我认为你的方法不好。您应该将其链接到一个可观察对象中并订阅它。差不多

 this.route.params.pipe(
    switchMap(params => this.service.getMineral(params.id))).subscribe()  

我认为我的方法也不好。它失败的事实暗示了这一点。至于您的建议,我想知道您在代码中的何处将参数的ID设置为本地属性。还是我遗漏了什么?我还想知道链接答案中建议的方法是否也有缺陷,或者我只是没有正确地遵循它。我犯了一个错误,那就是params.id,而不是this.params.id。抱歉搞混了。我不确定您发送的解决方案。我认为上面的代码应该可以工作。Angular中RxJS的下一个级别是永远不要订阅:)使用
async
管道使用模板中的流。然后打开
ChangeDetectionStrategy.OnPush
。这样,流将永远不会泄漏内存,并且您将具有良好的性能<代码>{{data$| async}}@blid这听起来像是我想在我的项目中实现的东西。您是说这个答案中的示例与预期的一样,但是我们可以省略subscribe()部分,直接在模板中使用异步管道吗?我担心这在理论上和简单案例中都是一个不错的方法。然后,这种恶劣的现实发生了,我们有一堆边缘情况,使其过于复杂,难以长期维护,尽管。。。