Angular7:如何重写嵌套订阅?

Angular 7: How to re-write nested subscribtions?

我有一个显示过滤后的项目列表的组件。它订阅了两个可观察对象——第一个是用于(过滤器)参数,需要传递给第二个可观察对象以获得过滤后的项目列表。

public filteredItems = [];

this.myService.getFilterParams()
   .subscribe(params => {
       this.myService.getFilteredItems(params)
         .subscribe(items => { this.filteredItems = items});
   });

我了解到链接订阅不是最佳实践(否则代码工作正常),那么我该如何重写它?

您可以使用 mergeMapswitchMap 来实现此目的。不同之处在于,如果外部订阅发出新值,switchMap 将取消内部订阅,mergeMap 不会。

this.myService
    .getFilterParams()
    .pipe(mergeMap(params => this.myService.getFilteredItems(params)))
    .subscribe(items => {
        this.filteredItems = items;
    });

您可以在此处使用switchMap、mergeMap、concatMap 高阶运算符。

  1. 如果您的第一个 observable 将发出多个值并且您希望从订阅函数中的所有内部 observable 收集响应,请使用 mergeMap。它还将并行发送请求,并且在订阅中获得响应时不会维护顺序。

  2. 您还可以使用 concatMap,它将发送第一个请求并收集响应,然后为您的内部可观察对象发送第二个请求。

查看您的代码,我建议使用 switchMap,它将取消从您的第一个可观察对象发出的任何新值,并且您的订阅中只会收到最后一个内部可观察值。

如果需要,还可以点按响应以执行任何中间步骤。

希望对您有所帮助。

this.myService
    .getFilterParams()
    .pipe(
         tap( (res) => {
           // do any intermediate steps 
           console.log(res);
         }),
         switchMap(params => this.myService.getFilteredItems(params))
     )
     .subscribe(items => {
         this.filteredItems = items;
     });