【问题标题】:Transform an observable sequence into an observable sequence producing values only from the most recent observable sequence将可观察序列转换为仅从最近的可观察序列产生值的可观察序列
【发布时间】:2013-06-28 10:43:55
【问题描述】:

示例 1:

var obsNumber = /* observable that produce numbers */;
var obsText1 = /* observable that produce text */;
var obsText2 = /* observable that produce text */;
var obsContext = /* IF obsNumber < 5 THEN obsText1 ELSE obsText2 */;

obsContext 是一个 observable,它将返回来自 obsText1obsText2 的数据,具体取决于 obsNumber 的值。

示例 2:

var arrOfObservables = /* an array of observables */;
var obsNumber = /* observable that produce numbers */;
var obsSelect = /* arrOfObservables[obsNumber] */;

obsSelect 是一个 observable,它将返回来自 arrOfObservables 数组的选定 observable 的数据,该数组由 obsNumber 生成的值确定。

我不知道如何使用 RxJS 来指定这种行为。在我看来,我需要能够在多个可观察对象之间动态订阅/取消订阅。

如何使用 RxJS 使这两个示例工作?

【问题讨论】:

    标签: reactive-programming rxjs reactive-extensions-js


    【解决方案1】:

    使用switch:

    将可观察序列的可观察序列转换为仅从最近的可观察序列产生值的可观察序列。

    示例 1

    var obsNumber,
        obsText1,
        obsText2;
    
    obsNumber = Rx.Observable.interval(500).take(10);
    obsText1 = Rx.Observable.return('a');
    obsText2 = Rx.Observable.return('b');
    
       obsNumber
        .do(function (x) {
            console.log('x: ' + x);
        })
        .map(function (x) {
            return x < 5 ? obsText1 : obsText2;
        })
        .switch()
        .subscribe(function (context) {
            console.log('context: ' + context);
        });
    &lt;script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'&gt;&lt;/script&gt;

    示例 2

    var obsNumber,
        arrOfObservables;
    
    obsNumber = Rx.Observable.range(0, 3);
    
    arrOfObservables = [
        Rx.Observable.return('a'),
        Rx.Observable.return('b'),
        Rx.Observable.return('c')
    ];
    
    obsNumber
        .do(function (x) {
            console.log('x: ' + x);
        })
        .map(function (x) {
            return arrOfObservables[x];
        })
        .switch()
        .subscribe(function (context) {
            console.log('context: ' + context);
        });
    &lt;script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'&gt;&lt;/script&gt;

    【讨论】:

    • 我的印象是您应该在这里使用 selectMany 而不是 select。 Rx 会自动解开您在 select 的函数中返回的 Observable,还是 switchLatest 的一个特性?
    • @raimohanska 用于解开内部 observable 的 3 个“内置”函数是 switchLatest(保持取消订阅前一个并订阅新的),concatObservable(将每个 observable 排队并订阅它们按顺序)和mergeObservable(同时订阅它们)。 selectMany 只是 select(return an observable).mergeObservable() 的简写
    • @Brandon 谢谢,我实际上并不知道 concat/mergeObservable 方法。这三个一起形成了非常好的 API。在我看来,select 和 selectMany 方法的命名有点糟糕。
    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多