Объединить два потока 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 документация.