目前,zip只会在所有可观察到的拉链产生值时产生一个值。例如,从医生那里:
使用选择器函数将指定的可观测序列或许诺合并为一个可观测序列,只要所有可观测序列的都产生了一个元素。
我正在寻找一个可观察的,它可以拉链,一个可观测的,但会产生一个序列的压缩可观测,在这里,它不重要,如果所有产生一个值。
比方说,我有$,observ1,observ2。滴答$总是产生每一个x秒的值。而observ1和observ2只是不时地产生..。我希望我的小溪看起来像
[tick, undefined, observ2Res],
[tick, undefined, undefined],
[tick, observ1Res, observ2Res]
...
...它不合并最新,考虑到组合最新采取的是给定可观察到的最新值。
发布于 2016-03-09 18:41:42
我相信buffer (或者sample)可能会让你走上正轨。buffer方法接受一个可观察的方法,用于定义缓冲区边界。生成的流会发出在该窗口中发出的任何项(例如,从用于buffer的RXJS文档中窃取):
var source = Rx.Observable.timer(0, 50)
.buffer(function () { return Rx.Observable.timer(125); })
.take(3);
var subscription = source.subscribe(x => console.log('Next: ', x));
// => Next: 0,1,2
// => Next: 3,4,5
// => Next: 6,7因此,我们现在有了一种方法,在特定的时间窗口中获取流发出的所有事件。在您的例子中,我们可以使用tick$来描述我们的采样周期,而observ1和observ2是我们想要缓冲的底层流:
const buffered1 = observ1.buffer(tick$);
const buffered2 = observ2.buffer(tick$);每隔一段时间,这些流就会发出一次,并会发出一个从底层流发出的所有项的列表(在此期间)。buffered流将发出如下数据:
|--[]--[]--[1, 2, 3]--[]-->要获得所需的输出,我们可以选择只查看每个缓冲结果的最新发出项,如果没有发出的数据,则可以传递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];
}前面我演示的示例流现在如下所示:
|--null--null--3--null-->最后,我们可以对这两个流进行zip,以便在tick$间隔期间获得“最新”发出的数据:
const sampled$ = buffered1.zip(buffered2);这个sampled$流将通过observ1窗口从我们的observ1和observ2流发出最新的数据。下面是一个示例结果:
|--[null, null]--[null, 1]--[1, 2]-->https://stackoverflow.com/questions/35897943
复制相似问题