首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当任何可观察到的值发出值时,就可以选择生成值的zip。

当任何可观察到的值发出值时,就可以选择生成值的zip。
EN

Stack Overflow用户
提问于 2016-03-09 17:02:26
回答 1查看 1K关注 0票数 2

目前,zip只会在所有可观察到的拉链产生值时产生一个值。例如,从医生那里:

使用选择器函数将指定的可观测序列或许诺合并为一个可观测序列,只要所有可观测序列的都产生了一个元素。

我正在寻找一个可观察的,它可以拉链,一个可观测的,但会产生一个序列的压缩可观测,在这里,它不重要,如果所有产生一个值。

比方说,我有$,observ1,observ2。滴答$总是产生每一个x秒的值。而observ1和observ2只是不时地产生..。我希望我的小溪看起来像

代码语言:javascript
复制
[tick, undefined, observ2Res],
[tick, undefined, undefined],
[tick, observ1Res, observ2Res]
...
...

它不合并最新,考虑到组合最新采取的是给定可观察到的最新值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-09 18:41:42

我相信buffer (或者sample)可能会让你走上正轨。buffer方法接受一个可观察的方法,用于定义缓冲区边界。生成的流会发出在该窗口中发出的任何项(例如,从用于buffer的RXJS文档中窃取):

代码语言:javascript
复制
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$来描述我们的采样周期,而observ1observ2是我们想要缓冲的底层流:

代码语言:javascript
复制
const buffered1 = observ1.buffer(tick$);
const buffered2 = observ2.buffer(tick$);

每隔一段时间,这些流就会发出一次,并会发出一个从底层流发出的所有项的列表(在此期间)。buffered流将发出如下数据:

代码语言:javascript
复制
|--[]--[]--[1, 2, 3]--[]-->

要获得所需的输出,我们可以选择只查看每个缓冲结果的最新发出项,如果没有发出的数据,则可以传递null:

代码语言:javascript
复制
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];
}

前面我演示的示例流现在如下所示:

代码语言:javascript
复制
|--null--null--3--null-->

最后,我们可以对这两个流进行zip,以便在tick$间隔期间获得“最新”发出的数据:

代码语言:javascript
复制
const sampled$ = buffered1.zip(buffered2);

这个sampled$流将通过observ1窗口从我们的observ1observ2流发出最新的数据。下面是一个示例结果:

代码语言:javascript
复制
|--[null, null]--[null, 1]--[1, 2]-->
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35897943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档