合并两个RxJS流(基于同步)

Combine two RxJS streams (based on synchrony)

本文关键字:于同步 同步 两个 合并 RxJS      更新时间:2023-09-26

我有两个RxJS主题,说ab,我需要以某种方式组合。

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

我想把它们组合起来,这样如果ab同步更新,值就会一起传递:

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

这可能吗?如果是,又是怎样的呢?即使有可能,这是应该避免的吗?

您应该能够使用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 repo包含一些Scheduler文档