Преобразуйте наблюдаемую последовательность в наблюдаемую последовательность, производящую значения только из самой последней наблюдаемой последовательности

Пример 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 является наблюдаемой, которая будет возвращать либо данные из obsText1 или же obsText2в зависимости от стоимости obsNumber,

Пример 2:

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

obsSelect является наблюдаемой, которая будет возвращать данные из выбранной наблюдаемой из arrOfObservables массив определяется значением, произведенным obsNumber,

Я не могу понять, как определить это поведение с помощью RxJS. Мне кажется, мне нужно иметь возможность динамически подписываться / отписываться между несколькими наблюдаемыми.

Как заставить два примера работать с использованием RxJS?

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);
    });
<script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'></script>

Пример 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);
    });
<script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'></script>

Другие вопросы по тегам