我正在寻找将流转换为具有历史记录或最后N个事件的流的运算符。
例如,对于流像这样一个:
clicks$.subscribe((ev) => ...)
我想要类似的东西:
clicks$.pipe(
historyOf(2)
).subscribe(([ev, ev-1, ev-2]) => ...)
像这样的运算符存在吗,还是有一种简单的方法可以将现有的运算符组合起来以达到预期的效果?
答案 0 :(得分:6)
当事件少于bufferCount
或N
或scan
时,您可以理想地使用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);
答案 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]------|