Javascript RxJS-从一个可观察对象中获取n个最后元素

Javascript RxJS-从一个可观察对象中获取n个最后元素,javascript,rxjs,reactive,Javascript,Rxjs,Reactive,我想从一个可观测的物体上取最后三个元素。假设我的时间表如下所示: [a] [a, b] [a, b, c] [b, c, d] [c, d, e] [d, e, f] [e, f, g] [f, g, h] ... and so on --a--b-c--d--e--f-g-h-i--j-> 其中:a、b、c、d、e、f、g、h、i、j是发射值 每当发出一个新值时,我希望立即获得它,因此它可以如下所示: [a] [a, b] [a, b, c] [b, c, d] [c, d, e] [d,

我想从一个可观测的物体上取最后三个元素。假设我的时间表如下所示:

[a]
[a, b]
[a, b, c]
[b, c, d]
[c, d, e]
[d, e, f]
[e, f, g]
[f, g, h]
... and so on
--a--b-c--d--e--f-g-h-i--j->

其中:
a、b、c、d、e、f、g、h、i、j是发射值

每当发出一个新值时,我希望立即获得它,因此它可以如下所示:

[a]
[a, b]
[a, b, c]
[b, c, d]
[c, d, e]
[d, e, f]
[e, f, g]
[f, g, h]
... and so on
我认为这非常有用。想象一下,在构建一个聊天室时,您希望显示最后10条消息。每当出现新消息时,您都希望更新视图

我的尝试:

您可以查看函数。一个区别是,它至少要发射3次(本例中为第一个参数)

const source=Rx.可观测间隔(1000);
常量示例=source.bufferCount(3,1)
constsubscribe=example.subscribe(val=>console.log(val))

您可以使用
scan
进行以下操作:

from(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u'])
  .pipe(
    scan((acc, val) => {
      acc.push(val);
      return acc.slice(-3);
    }, []),
  )
  .subscribe(console.log);
这将打印:

[ 'a' ]
[ 'a', 'b' ]
[ 'a', 'b', 'c' ]
[ 'b', 'c', 'd' ]
[ 'c', 'd', 'e' ]
...
[ 's', 't', 'u' ]
bufferCount
不会执行您想要的操作。只有当每个缓冲区正好是
==3
时,它才会发射,这意味着在发布至少3条消息之前,您不会得到任何发射


2019年1月:RxJS 6更新

Upvote以获得正确答案。我还有一个小箱子谢谢!它正是我想要实现的,每一个聪明的人!知道为什么这不是一个内置的运营商吗?我一定是遇到了RxJs的所有不常见的用例,因为我一直在寻找这样的东西,它们还没有内置。但是,累积的阵列不会继续增长吗?似乎是内存泄漏。这是一个很好的答案,但更简洁、功能更强大的版本可以使用
scan((acc,val)=>[…acc,val].slice(-3),[])
谢谢您的回答!正如@martin所提到的,只有当每个缓冲区正好===3个字节时,bufferCount才会发出。我也提到过,你可以做
source.next(null);source.next(空);source.next(空)[sic]