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