簡體   English   中英

如何做一個滑動緩沖流?

[英]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)

addToprocessBuffer函數具有明顯的含義。

您是否嘗試過使用bufferCountskip / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM