Объединить два потока RxJS (на основе синхронизации)
у меня есть два предмета RxJS, скажем a
и b
что мне нужно как-то совместить.
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
это возможно? Если это так, как так? Даже если это возможно, то, чего следует избегать?
1 ответов
вы должны иметь возможность использовать 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
если asap
Scheduler
не указано, выход будет:
value: 1 2
value: 3 2
value: 3 4
РЕПО RxJS GitHub содержит некоторые Scheduler
документация.