Rxjs zip的替代方案,它在任何可观察对象发出值时生成值
目前,只要所有压缩的可观察对象都产生一个值,zip就只会产生一个值。例如,从文档中: 将指定的可观察序列或承诺合并为一个 当所有的 可观测序列产生了一个元素 我在寻找一个可以压缩一个可观察对象的可观察对象,但会产生一个压缩可观察对象序列的数组,在这个数组中,所有的都产生一个值并不重要 e、 g.假设我有勾号$,观察值1,观察值2。。勾选$始终每x秒产生一次价值。。而observ1和observ2只能不时生成。。 我希望我的流看起来像Rxjs zip的替代方案,它在任何可观察对象发出值时生成值,rxjs,Rxjs,目前,只要所有压缩的可观察对象都产生一个值,zip就只会产生一个值。例如,从文档中: 将指定的可观察序列或承诺合并为一个 当所有的 可观测序列产生了一个元素 我在寻找一个可以压缩一个可观察对象的可观察对象,但会产生一个压缩可观察对象序列的数组,在这个数组中,所有的都产生一个值并不重要 e、 g.假设我有勾号$,观察值1,观察值2。。勾选$始终每x秒产生一次价值。。而observ1和observ2只能不时生成。。 我希望我的流看起来像 [tick, undefined, observ2Res],
[tick, undefined, observ2Res],
[tick, undefined, undefined],
[tick, observ1Res, observ2Res]
...
...
它不是combine latest,因为combine latest获取给定可观察对象的最新值。我相信
缓冲区
(或者示例
)可能会让您走上正确的道路。buffer
方法接受用于定义缓冲区边界的可观察对象。结果流将发出在该窗口中发出的任何项目(例如从RXJS文档中为缓冲区
)窃取的项目):
因此,我们现在有了一种方法,可以在特定的时间窗口内获取流发出的所有事件。在您的情况下,我们可以使用tick$
来描述我们的采样周期,observ1
和observ2
是我们想要缓冲的底层流:
const buffered1 = observ1.buffer(tick$);
const buffered2 = observ2.buffer(tick$);
这些流中的每一个都将在每个tick$期间发出一次,并将从基础流(在该期间)发出所有已发出项的列表。缓冲的流将发出如下数据:
|--[]--[]--[1, 2, 3]--[]-->
|--null--null--3--null-->
为了获得您想要的输出,我们可以选择只查看每个缓冲结果的最新发出的项,如果没有发出的数据,我们可以传递null:
const buffered1 = observ1.buffer($tick).map(latest);
const buffered2 = observ2.buffer($tick).map(latest);
function latest(x) {
return x.length === 0 ? null : x[x.length - 1];
}
我前面演示的示例流现在如下所示:
|--[]--[]--[1, 2, 3]--[]-->
|--null--null--3--null-->
最后,我们可以zip
这两个流在tick$
间隔期间获取“最新”发出的数据:
const sampled$ = buffered1.zip(buffered2);
此采样的$
流将通过勾选$
窗口从我们的observ1
和observ2
流发出最新数据。下面是一个示例结果:
|--[null, null]--[null, 1]--[1, 2]-->
卡尔文,试过这个,我的目标是什么。不幸的是,我仍然可以投票,但我将此标记为答案。