【问题标题】:Second subscription doesn't start upon switchMap from the first one in RXJS第二个订阅不会从 RXJS 中的第一个订阅的 switchMap 开始
【发布时间】:2020-02-09 09:10:39
【问题描述】:

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

this.route.params.subscribe(_ => {
  this.id = _.id;
  this.service.getMineral(this.id)
    .subscribe(suc => this.data = suc, err => console.log(err));
  }
);

然后,我尝试使用更好的方法,并希望在第一个订阅完成时调用第二个订阅。根据the second sample in this answer,我应该分享第一个结果,然后切换地图以取消订阅并继续下一个。所以我实现了以下。

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));

遗憾的是,这不会调用服务器,也不会将数据传递给客户端。在尝试了几次修改后,由于缺乏想法,我放弃了。

这两种方法之间的显着区别是什么?我对第二个样本的解释有什么困惑?

【问题讨论】:

    标签: angular typescript rxjs switchmap


    【解决方案1】:

    我认为你的方法很糟糕。您应该将其链接到一个 observable 并订阅它。类似的东西

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

    【讨论】:

    • 我认为我的方法也很糟糕。它失败的事实暗示了这一点。至于您的建议 - 我想知道您在代码中的哪个位置将参数的 ID 设置为本地属性。还是我错过了什么?我还想知道链接答案中建议的方法是否也有缺陷,或者我只是没有正确遵循它。
    • 我弄错了,那是 params.id 而不是 this.params.id。很抱歉造成混淆。我不确定您发送的解决方案。我认为上面的代码应该可以工作。
    • Angular 中 RxJS 的下一个级别是永远不要订阅 :) 使用 async 管道在模板中使用您的流。然后打开ChangeDetectionStrategy.OnPush。这样,流将永远不会泄漏内存,并且您将获得良好的性能。 <div>{{data$ | async}}</div>
    • @blid 这听起来像是我想在我的项目中实现的东西。您是说这个答案中的示例是应该的,但是我们可以省略 subscribe() 部分并直接在模板中使用 async 管道?我担心这在理论上和简单的情况下都是一个不错的方法。然后,这个令人讨厌的现实发生了,我们有一堆边缘情况,从长远来看,这使得它过于复杂和难以维护......
    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多