我有以下问题。我想订阅一个可观察的使用异步管道的角。但是,管道中的数据可以来自不同的数据源,而管道可能因数据源的不同而不同。
现在实现它的方式不起作用,因为我覆盖this.data$的第一个值,因此源A永远不会被订阅。
根据过滤器的不同,是否有可能将管道“拆分”?
problem.component.ts:
// Data source A and logic A 
this.data$ = this.service.context.pipe(
  filter(context => context.flag === true),
  switchMap(context => this.dataSourceA(context.id))
  map(data => this.processDataA(data))
);
// Data source B and logic B 
this.data$ = this.service.context.pipe(
  filter(context => context.flag === false),
  switchMap(context => this.dataSourceB(context.id))
  map(data => this.processDataB(data))
);problem.component.html
<pro-table [data]="data$ | async"></pro-table>发布于 2019-12-23 16:11:31
将逻辑移动到您的switchMap()
this.data$ = this.service.context.pipe(
   switchMap(context => context.flag
      ? this.dataSourceA(context.id).pipe(map(d => this.processDataA(d)))
      : this.dataSourceB(context.id).pipe(map(d => this.processDataB(d)))
   )
);发布于 2019-12-23 16:11:28
这是实现你想要的结果的错误方式。你必须接管一个叫做“高阶可观测”的东西:Observable<Observable<T>>。就像一个“高阶函数”(它能够根据它的参数产生另一个函数),这个家伙能够根据你所依赖的任何参数化来产生另一个Observable。
this.service.context.pipe(
  switchMap(context => context.flag ? this.dataSourceA(context.id).pipe(...) : this.dataSourceB(context.id).pipe(...))
);从一开始,...it似乎有点深奥,但实际上并非如此。
要记住的重要一点:高阶可观测值允许您将流参数化(如果是一种奇特的方式):通过处理流的流()。
发布于 2019-12-23 16:18:31
您可以添加一个Subject,它将捕获许多数据源并订阅:
    this.data$ = new Subject();
    observer = {
     next(data) { this.data$.next(data) },
     error(msg) { /*handle error*/ }
   };
    // Data source A and logic A 
   this.service.context.pipe(
     filter(context => context.flag === true),
     switchMap(context => this.dataSourceA(context.id))
     map(data => this.processDataA(data))
   ).subscribe(observer);
   this.service.context.pipe(
     filter(context => context.flag === false),
     switchMap(context => this.dataSourceB(context.id))
     map(data => this.processDataB(data))
   ).subscribe(observer);但在这种情况下,您似乎可以使用该标志将其保存在一个块中:
this.service.context.pipe(
     switchMap(context => context.flag ?
         this.dataSourceA(context.id) : this.dataSourceB(context.id)
    )
     map(data => this.processData(data)) // handle both cases
   ).subscribe(observer);https://stackoverflow.com/questions/59458172
复制相似问题