你应该能够使用
scan
操作员实现您想要的功能:
const { range } = rxjs;
const { scan } = rxjs.operators;
const N = 4;
range(0, 10).pipe(
scan((acc, value) => [...acc.slice(1 - N), value], [])
).subscribe(
value => console.log(JSON.stringify(value))
);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@6/bundles/rxjs.umd.min.js"></script>
您可以将实现包装在函数中以创建用户区域运算符:
import { MonoTypeOperatorFunction, scan } from "rxjs";
export function bufferRecent<T>(count: number): MonoTypeOperatorFunction<T> {
if (count < 2) {
throw new Error("Expected count > 1");
}
return scan((acc: T[], value: T) => [...acc.slice(1 - count), value], []);
}
range(0, 10).pipe(
bufferRecent(N)
).subscribe(
value => console.log(JSON.stringify(value))
);