[英]How to do a sliding buffer stream?
鑒於我使用bufferCount
的以下代碼(不是我想要的)......
var Rx = require('rxjs/Rx');
var Observable = Rx.Observable;
var Subject = Rx.Subject;
var first = new Rx.Subject();
var source = first.bufferCount(2).map(a => a.reduce((acc,x) => acc+x,0));
var subscription = source.subscribe(console.log)
first.next(1)
first.next(2)
first.next(2)
first.next(3)
我得到
3
5
我想得到的是
3
4
5
所以緩沖區正在緩沖最后 2 個項目。
有沒有辦法簡單地做到這一點?
使用scan
運算符來保存滑動緩沖區並對其進行操作。 例如 :
var source = first.scan((slidingBuffer, newInput) => {
return addTo(slidingBuffer, newInput)
}, [])
.map(processBuffer)
addTo
和processBuffer
函數具有明顯的含義。
您是否嘗試過使用bufferCount
的skip
/ startBufferEvery
參數? 這使您可以生成重疊的緩沖區,然后可以根據需要減少它們。 這種方式不涉及發出必須隨后過濾掉的值。 如果您特別希望緩沖區大小為2,則可以使用pairwise
而不是bufferCount。
Keith:-使用此方法的代碼
var Rx = require('rxjs/Rx');
var Observable = Rx.Observable;
var Subject = Rx.Subject;
var first = new Rx.Subject();
var source = first.bufferCount(2,1).map(a => a.reduce((acc,x) => acc+x,0));
var subscription = source.subscribe(console.log)
first.next(1)
first.next(2)
first.next(2)
first.next(3)
您可以將數組操作與掃描結合使用。 這是我使用的最大尺寸為 20 件的東西。
first.pipe(
scan((buffer, newItem) => ([ newItem, ...buffer].slice(0, 20)), <string[]>[])
)
與bufferCount()
不同, bufferCount()
會立即發出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.