累积值,例如扫描,但可以随时间重置累加器

时间:2018-04-25 08:05:12

标签: rxjs

我有一个Observable, obs1 ,它代表一段时间内的数字流。我需要累积这些数字的总和并逐步发出它(也就是说我需要使用scan运算符)。

然后有第二个Observable, obs2 ,代表某种"重置时间"。换句话说,当 obs2 发出时,我必须重置我在 obs1 上设置的累加器,并从0开始求和。

我认为我已经能够通过以下代码达到我想要的行为,但我不确定这是否是正确的方法(对我来说有点气味)

const obs1 = Observable.interval(100).mapTo(1).take(100);

const obs2 = Observable.interval(700).take(10);

obs1.pipe(
    windowWhen(() => obs2),
    mergeMap(d => d.pipe(scan((acc, one) => acc + one, 0)))
)
.subscribe(console.log);

关于如何改进它的任何建议?

1 个答案:

答案 0 :(得分:2)

可能这样的东西就是我在寻找的东西

const obs1 = Observable.interval(100).mapTo(1).take(100);

const obs2 = Observable.interval(700).take(10);


function scanReset(seed) {
    return obs1.pipe(
        scan((acc, one) => acc + one, seed)
    )
}

obs2.pipe(
    switchMap(() => scanReset(0))
)
.subscribe(console.log);