【问题标题】:Is it possible to turn a simple Subject into a BehaviorSubject?是否可以将简单的主题变成行为主题?
【发布时间】:2019-05-16 01:54:58
【问题描述】:

我有一个简单但很难的 RxJS 相关问题。假设我想订阅一个我无法修改的库提供的主题,但我希望该订阅的行为就像我订阅了一个 BehaviorSubject。有没有可能做这样的事情:

let plainSubject: Subject<string> = someLibrary.getSubject();
let behaviorSubject: BehaviorSubject<string> = BehaviorSubject.from(plainSubject);
let subscription = behaviorSubject.subscribe(() => foo());

如果这个问题没有任何意义,我很抱歉,我对 RxJS 的了解仍然相当基础。我什至不确定这是否可能,因为我没有通过谷歌搜索找到任何迹象。

提前致谢!

约书亚

【问题讨论】:

    标签: javascript angular typescript rxjs


    【解决方案1】:

    你可以:

    let behaviorSubject = new BehaviorSubject();
    someLibrary.getSubject().subscribe(behaviorSubject);
    behaviorSubject.subscribe(() => foo());
    

    【讨论】:

      【解决方案2】:

      由于流是不可变的,您可以将主题“更改”为行为之一。

      但你完全可以模拟一个或从中创建一个:

      const BS1$ = someLibrary.getSubject().pipe(
        startWith(undefined),
      );
      
      const BS2$ = new BehaviorSubject(undefined).pipe(
        switchMap(v => someLibrary.getSubject())
      );
      

      startWith 使流以给定值开始,switchMap 将初始流的值更改为提供的值。

      他们都来自'rxjs/operators'

      选择你的武器!

      【讨论】:

      • 似乎BS2$ 的行为不像BehaviorSubject,而是会立即将订阅者切换到另一个流,不是吗?恕我直言,将Subject 转换为BehaviorSubject 的最简单方法是订阅前者:subject.subscribe(behaviorSubject)。另一种方法是:publishBehavior()connect()。或startWithshareReplay(1)(此选项不是 100% 复制 BS 行为)。抱歉,如果我遗漏了什么。总帐
      • @kos 不要抱歉,请回答!而对于第二个,从我没有测试过的情况来看,每个订阅都会进行一个 http 调用并返回响应
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多