RxJS-哪个运算符可以组合最近N个事件的历史记录?

时间:2018-12-19 10:31:01

标签: javascript rxjs

我正在寻找将流转换为具有历史记录或最后N个事件的流的运算符。

例如,对于流像这样一个:

clicks$.subscribe((ev) => ...)

我想要类似的东西:

clicks$.pipe(
   historyOf(2)
).subscribe(([ev, ev-1, ev-2]) => ...)

像这样的运算符存在吗,还是有一种简单的方法可以将现有的运算符组合起来以达到预期的效果?

2 个答案:

答案 0 :(得分:6)

当事件少于bufferCountNscan时,您可以理想地使用filter或根据想要处理序列开始或终止的方式使用:

const N = 3;

of(1, 2, 3, 4, 5, 6, 7).pipe(
  bufferCount(N, 1), // `1` means it'll emit after every emission from source
).subscribe(console.log);

...或者如果您想在链完成时跳过排放:

of(1, 2, 3, 4, 5, 6, 7).pipe(
  bufferCount(N, 1),
  filter(arr => arr.length === N),
).subscribe(console.log);

...或者如果您也想要开始事件:

of(1, 2, 3, 4, 5, 6, 7).pipe(
  scan((acc, item) => [...acc, item].slice(-N), []),
).subscribe(console.log);

实时演示:https://stackblitz.com/edit/rxjs-xtnscq

答案 1 :(得分:0)

我已经启动了一个(非常)小的我想要的rxjs utils库。碰巧有一个您可能感兴趣的人:withHistory。从文档中:

source:         -1----2------3--------4--------5--------|
withHistory(2): -[1]--[2,1]--[3,2,1]--[4,3,2]--[5,4,3]--|
withHistory(0): -[1]--[2]----[3]------[4]------[5]------|

图书馆在这里:https://github.com/simontonsoftware/s-rxjs-utils