2016-08-31 4 views
6

У меня есть две темы RxJS, скажем a и b, что мне нужно как-то соединить.Объединить два потока RxJS (на основе синхронизации)

someComboOfAandB.subscribe({aVal, bVal} => console.log("value:", aVal, bVal)); 

Я хочу, чтобы объединить их таким образом, что если a и b обновляются синхронно, значения поставляются вместе:

a.next(1); 
// some code 
b.next(2) 

// at end of synchronous code/frame: 
// value: 1 2 

Однако, если только одно значение обновляется, обновление будет еще толкания в то же время будет перенесено обновление с двумя новыми значениями:

a.next(5) 

// at end of synchronous code/frame: 
// value: 5 2 

Возможно ли это? Если да, то как? Даже если это возможно, это то, чего следует избегать?

+0

'combLatest'? –

+0

http://reactivex.io/documentation/operators/combinelatest.html –

+0

@LukaJacobowitz Проблема в том, что в первом примере выше запускается два обновления, чего я не могу получить. – JKillian

ответ

2

Вы должны быть в состоянии использовать Scheduler, чтобы осуществить поведение, которое вы хотите:

import "rxjs/add/observable/combineLatest"; 
import "rxjs/add/operator/map"; 

import { BehaviorSubject } from "rxjs/BehaviorSubject"; 
import { Observable } from "rxjs/Observable"; 
import { asap } from "rxjs/scheduler/asap"; 

let a = new BehaviorSubject(1); 
let b = new BehaviorSubject(2); 
let combined = Observable 
    .combineLatest(a, b, asap) 
    .map((values) => ({ aVal: values[0], bVal: values[1] })); 

combined.subscribe(
    ({ aVal, bVal }) => { console.log("value:", aVal, bVal); } 
); 

a.next(3); 
b.next(4); 

Вышеприведенный код выведет следующее:

value: 3 4 

Если asapScheduler не указан, вывод будет:

value: 1 2 
value: 3 2 
value: 3 4 

Репо RxJS GitHub содержит Scheduler documentation.

+0

В соответствии с документами «asap» «Расписания» в очереди микрозадач, в которой используется самый быстрый механизм транспорта, либо ... Web Worker MessageChannel или setTimeout или другие ». Это звучит очень многообещающе, я дам ему попробовать завтра – JKillian

+0

Пробовал это в своем коде, и интересно, что 'asap' не работает, но' async' сделал. Наверное, я не понимаю разницы между ними в контексте браузера. – JKillian

+0

Хм, это расстраивает - иногда кажется, что это работает, иногда это не так. У меня есть место в моей базе кода в основном как таковое: «log (« start »); a.next (1); журнал ("середина"); b.next (2); «И я получаю« начало »,« обновление подписки »,« середина », где подписчик получает обновление синхронно с« a.next ». перед вызовом 'b.next'. В других случаях это работает:/ – JKillian

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