2017-02-22 3 views
0

В настоящее время функции isEven и isOdd вызывается для каждого IF. Есть ли способ, чтобы функции вызывались только тогда, когда оценка IF соответствовала логическому пути функции?Как использовать Observable.If без вызовов функций

Пример: отнесение JSBin: http://jsbin.com/wegesaweti/1/edit?html,js,output)

var isEven = function(x) { 
    console.log('function isEven called') 
    return Rx.Observable.return(x + ' is even'); 
};  
var isOdd = function(x) { 
    console.log('function isOdd called') 
    return Rx.Observable.return(x + ' is odd'); 
}; 
var source = Rx.Observable.range(1,4) 
    .flatMap((x) => Rx.Observable.if(
    function() { return x % 2; }, 
    isOdd(x), 
    isEven(x) 
));  
var subscription = source.subscribe(
    function (x) { 
     console.log('Next: ' + x); 
    }); 

Токовый выход:

function isOdd called 
function isEven called 
Next: 1 is odd 
function isOdd called 
function isEven called 
Next: 2 is even 
function isOdd called 
function isEven called 
Next: 3 is odd 
function isOdd called 
function isEven called 
Next: 4 is even 

Ожидаемый результат

function isOdd called 
Next: 1 is odd 
function isEven called 
Next: 2 is even 
function isOdd called 
Next: 3 is odd 
function isEven called 
Next: 4 is even 

Спасибо!

ответ

1

Основание на RXJS docuemntationthenSource и elseSource должны быть Observable (или Scheduler для elseSource).

Альтернатива для вашей проблемы:

var source = Rx.Observable.range(1,4).flatMap((x) => 
    (x % 2) == 1 ? isOdd(x) : isEven(x) 
); 

Рабочий пример: http://jsbin.com/godubemano/1/edit?html,js,output

+0

Спасибо! Работает хорошо! –

Смежные вопросы