首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于滤波器RxJS的不同管道

基于滤波器RxJS的不同管道
EN

Stack Overflow用户
提问于 2019-12-23 16:03:56
回答 3查看 690关注 0票数 3

我有以下问题。我想订阅一个可观察的使用异步管道的角。但是,管道中的数据可以来自不同的数据源,而管道可能因数据源的不同而不同。

现在实现它的方式不起作用,因为我覆盖this.data$的第一个值,因此源A永远不会被订阅。

根据过滤器的不同,是否有可能将管道“拆分”?

problem.component.ts:

代码语言:javascript
运行
复制
// 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

代码语言:javascript
运行
复制
<pro-table [data]="data$ | async"></pro-table>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-23 16:11:31

将逻辑移动到您的switchMap()

代码语言:javascript
运行
复制
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)))
   )
);
票数 5
EN

Stack Overflow用户

发布于 2019-12-23 16:11:28

这是实现你想要的结果的错误方式。你必须接管一个叫做“高阶可观测”的东西:Observable<Observable<T>>。就像一个“高阶函数”(它能够根据它的参数产生另一个函数),这个家伙能够根据你所依赖的任何参数化来产生另一个Observable

代码语言:javascript
运行
复制
this.service.context.pipe(
  switchMap(context => context.flag ? this.dataSourceA(context.id).pipe(...) : this.dataSourceB(context.id).pipe(...))
);

从一开始,...it似乎有点深奥,但实际上并非如此。

要记住的重要一点:高阶可观测值允许您将流参数化(如果是一种奇特的方式):通过处理流的流()。

票数 0
EN

Stack Overflow用户

发布于 2019-12-23 16:18:31

您可以添加一个Subject,它将捕获许多数据源并订阅:

代码语言:javascript
运行
复制
    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);

但在这种情况下,您似乎可以使用该标志将其保存在一个块中:

代码语言:javascript
运行
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59458172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档