2016-12-30 20 views
0

所以這個代碼運行,但它發射的回調.flatmap 5次:RxJS - 如何積累數據和行爲就可以了,無需多次回調

 var i = 0; 
     const values = {}; 
     return this.obsClient.take(5) 
      .flatMap(v => { 
       const time = Date.now(); 
       values[i] = {time: time, count: v.clientCount}; 
       console.log('values => ', values); 
       i++; 
       return Rx.Observable.timer(100) 
      }); 

「值=> X」將得到記錄5倍。

我想,也許,如果我做了以下內容,它會發射的flatMap回調之前積累的所有5個數據:

 var i = 0; 
     const values = {}; 
     return this.obsClient.take(5).takeLast(5) 
     .flatMap(v => { 
      const time = Date.now(); 
      values[i] = {time: time, count: v.clientCount}; 
      console.log('values => ', values); 
      i++; 
      return Rx.Observable.timer(100) 
     }); 

,但它仍然記錄「值=> x」的5倍。 如何積累數據,並將所有數據傳遞給回調,並避免發起回調5次?

回答

3

如果你只想序列中的最後五個項目一次:

return this.obsClient 
       .takeLast(5) 
       .toArray() 
       .flatMap(arr => { /*arr will be an array of the last five items in the sequence */ }) 
2

你可能會尋找bufferCount

return this.obsClient.bufferCount(5).flatMap(buffer => { 
    console.log(`buffer => ${buffer}`); 
    return Rx.Observable.timer(100); 
}); 

緩衝器源可觀測值,直到點擊數給出的最大bufferSize

+0

感謝讓我測試了這一點 –

+3

注;每當達到countCount時,'bufferCount'就會發出一個值。如果你的意圖是準確地有5個項目,然後取消訂閱,那麼使用'.take(5).toArray()'可以發出一個包含你的5個元素數組的值。 –