【问题标题】:RxJS: How to toggle to switch between multiple behavior subject sourcesRxJS:如何在多个行为主题源之间切换
【发布时间】:2018-08-08 21:02:25
【问题描述】:

场景:

我有一个要在其中显示数据的网格。我可能有两个(或更多)行为主体数据源。我还有一个可观察的切换开关,它返回一个数字,指示我想从哪个源显示数据(即 1 表示源 1,2 表示源 2,等等)。

问题:

如何组合 n 个源,但仅从可观察到的切换指示的源发出记录?我的网格将订阅生成的 observable。当切换 observable 发射时,我希望从选定的源发射最新的。

// Sources
let source1 = new BehaviorSubject([]);
let source2 = new BehaviorSubject([]);

// Toggle observable
let toggle = new BehaviorSubject(1); // default to source one

// Combined observable
let gridDataSource = ????

【问题讨论】:

  • 如果您不需要发出初始值,请尝试com­bineLat­estwith­Lat­est­From。如果顺序很重要,则使用concatMap,如果不是,则使用mergeMapswitchMapflatMap
  • 我确实需要一个初始值,但我不确定您所说的顺序是什么意思。我只想从其中一个来源发出,具体取决于选择哪一个。本质上,网格旁边会有一个源下拉选择器。
  • 不是创建许多b.subjects,你不能创建一个,然后你可以订阅它。因为一个主题的所有订阅者共享该主题的相同执行。在您的下拉选择器中,您可以通过 .next() 添加值

标签: javascript angular typescript rxjs


【解决方案1】:

Noémi Salaün 的 answer 很棒,它让我朝着正确的方向前进,但你可以用更少的代码让它更有活力,而且 RxJs 语法有点过时,所以我添加了一个更新的/这里也有改进版。

// as many as you like, in an array, map, or any other structure you like
source_a = new Subject();
source_b = new Subject();

// just directly pass them to the BehaviourSubject, no need for the array/index
toggle_source = new BehaviorSubject(source_a);
source = toggle_source.pipe(switchMap(source => source));

// change a source
toggle_source.next(source_b)

【讨论】:

    【解决方案2】:

    我认为switchMap 可以在这里解决问题。根据定义,它的目的是在多个来源之间切换。

    // Sources
    let sources = [
      new BehaviorSubject([]),
      new BehaviorSubject([]),
    ];
    
    // Toggle observable
    let toggle = new BehaviorSubject(0); // default to the first source
    
    // Selected observable
    let gridDataSource = toggle.switchMap((i) => source[i]);
    

    如果您不能或不想使用源数组,您可以回退到 switchMap 声明中的简单 switch-case。

    let gridDataSource = toggle.switchMap((i) => {
        switch(i) {
            case 1: return source1;
            case 2: return source2;
        }
    });
    

    【讨论】:

    • 能够非常快速地实现这一点而不会出现问题,并且它的行为与我希望的完全一样。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 2011-05-22
    • 2022-01-16
    • 2018-09-03
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多