2016-11-17 2 views
1

Мне нужен способ для переноса значений из наблюдаемой функции в две функции, каждая из которых принимает значение, и каждый в свою очередь возвращает наблюдаемый (излучая только одно значение, а затем завершая). Я надеялся, что .combineLatest() позволит мне передать проекционную функцию, но это не так.RxJS5: .combineLatest() с функцией проецирования?

Пример кода (не работает):

const ac = [1, 2, 3]; // only as example, I have complex types in my array not numbers 

Observable.from(ac) 
    .combineLatest(
     // processFn should get a number as argument and return Observable<number> 
     // does not work because .combineLatest does not accept two functions as arguments :(
     n => processFn1(n), 
     n => processFn2(n) 
    ) 
    .map(([result1, result2] => { 
     // result1, result2 should be flat numbers here, not Observables 
    }) 
); 

Любая идея о том, как сделать это?

ответ

1

Ваша идея использовать оператор combLatest верна, но это не в том месте. Если вам нужно выровнять наблюдаемые данные, вы должны использовать mergeMap. Это JSBIN, что делает то, что вы ожидаете: http://jsbin.com/rutovot/4/edit?html,js,console

код выглядит следующим образом:

const ac = [1, 2, 3]; 

Rx.Observable.from(ac) 
    // use mergeMap, it takes a function that accepts a value and 
    // returns an observable. MergeMap will listen to this observable 
    // under the hood and next the result of this observable down the 
    // the chain 
    .mergeMap(val => { 
    // Here we return an observable that combines the result of the 
    // call to both the functions 
    return Rx.Observable.combineLatest(fake(val), fake2(val)); 
    }) 
    .subscribe(val => console.log(val)); 
+0

Так тривиальна, как только вы читать :) – Dyna

+0

часто с RxJS, но это занимает некоторое время, чтобы привыкнуть к нему :) – KwintenP

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