首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RxJS:使用merge动态添加和删除可观察对象

RxJS:使用merge动态添加和删除可观察对象
EN

Stack Overflow用户
提问于 2019-06-09 18:24:09
回答 1查看 1.3K关注 0票数 2

我正在尝试构建一个可插拔的ProgressService

服务应该跟踪当前正在加载的“内容”的数量。并且有一个isLoading()方法,它返回一个Observable<boolean>来指示是否正在加载任何东西。

我的第一个解决方案非常天真,使用一个new BehaviorSubject(0),然后每个加载提供程序只调用ProgressService.increase()ProgressService.decrease()。这样做效果很好。但现在,如果可能的话,我想做更多的反应。

然后我遇到了merge,当所有加载提供者在一开始都是已知的时候,它工作得很好:

代码语言:javascript
复制
this.progress = merge(...progressProviders).pipe(
  scan((acc, curr) => acc + (curr ? 1 : -1), 0)
);

当任何加载提供程序发出truefalse时,这只会增加/减少progress的值。

但我还需要一些注册/注销功能。这基本上应该在merge链中添加一个新的Observable (或者删除它)。

新的ProgressService应该如下所示:

代码语言:javascript
复制
class ProgressService {

  progress: Observable<number> = EMPTY; // value > 0 when something is loading

  addLoadingProvider(lp: Observable<boolean>) {
    // increment this.progress, when lp emits true
    // decrease this.progress, when lp emits false
    // nice to have: ignore if lp's first emitted value is false
  }

  removeLoadingProvider(lp: Observable<boolean>) {
    // stop listening to lp
    // clean up: decrease this.progress, if lp last emitted true
  }

  isLoading(): Observable<boolean> {
    return this.progress.pipe(
      map(val => val !== 0)
    );
  }

}

如果我们从addLoadingProvider返回一个Subscription,并使用Subscription.unsubscribe()注销,那么可能根本不需要removeLoadingProvider方法(?)。

希望有人能告诉我如何按需mergeunmerge额外的观察值。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56513781

复制
相关文章

相似问题

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