2013-06-28 11 views
3

Примера 1:Transform наблюдаемой последовательности в наблюдаемые значения последовательности производить только из самых последней наблюдаемой последовательности

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?

ответ

5

Применение 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>

+0

Awesome. Благодарю. –

+0

У меня создалось впечатление, что вы должны использовать _selectMany_ вместо _select_ здесь. Rx автоматически разворачивает Observables, которые вы возвращаете в функции, заданной _select_, или это функция _switchLatest_? – raimohanska

+1

@raimohanska 3 "встроенные" функции для разворачивания внутреннего наблюдаемого являются 'switchLatest' (продолжает отменять подписку на предыдущий и подписываться на новый),' concatObservable' (очереди каждого наблюдаемого и подписывается на них в последовательности) и 'mergeObservable '(одновременно подписывается на них всех). 'selectMany' является просто кратким для' select (return a observable) .mergeObservable() ' – Brandon