javascript - RxJS - 最多缓冲 n 项并发出这些缓冲区

标签 javascript rxjs frp

我正在尝试从流中缓冲最多 n(假设 5)个项目,但发出部分填充的数组,直到缓冲区已满。

假设我有一个像这样的流:

const stream = Rx.Observable.range(0, 6);

我要发射:

[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[1, 2, 3, 4, 5]

到目前为止我有两个解决方案,我想知道哪个更“Rx 方式”。

如果元素多于n个,则扫描并移位累加器:

stream.scan((acc, current) => {
  acc.push(current);

  if (acc.length > 5) {
    acc.shift();
  }

  return acc;
}, []);

或者在不超过 5 个元素时扫描流并与缓冲区合并:

stream.scan((acc, current) => {
  acc.push(current);
  return acc;
}, [])
.takeWhile((x) => { return x.length < 5 })
.merge(stream.bufferWithCount(5));

哪种方法更好,更符合 Rx?根据 jsperf 的快速测试,在性能方面移动数组比合并快 60%。

或者有更好的解决方案?

最佳答案

第一种方法看起来相当不错。我还会将 acc 视为不可变数组。简单地说,不使用 pushshift 就做你正在做的事情。方法如下:

stream.scan((acc, current) => [...acc.slice(acc.length > 5 ? 1 : 0), current], []);

关于javascript - RxJS - 最多缓冲 n 项并发出这些缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36199167/

相关文章:

haskell - 我使用的是 react 香蕉吗?

javascript - 使 javascript 函数更短

javascript - 在 while 循环内正确执行 setInterval

angular - 从可观察数组获取最新的订阅响应 - Angular 7

haskell - ifB 在reactive-banana 中的实现

haskell - 有相当于步进器的网线吗?

javascript - 让 HTML 从不同位置加载 JS 文件,具体取决于环境

javascript - HighCharts:摆脱工具提示但保持十字准线

Angular >= 2 - 服务监听另一个服务中的变化

typescript - 使用闭包而不是 `thisArg` ? .pipe( map (