2017-08-10 61 views
4

Hellow,我試圖創建存儲最後一項來自OBS的observable(OBS)和subject(SUB)的函數,而SUB具有F值 和發射它(只有它)當孫換成TRxJS函數從一個observable發出最後一個值然後發出true

OBS ---a----b----c----d----e----f----g----h----- 
    SUB ------F----------T------------F-------T----- 
    OUT -----------------c--------------------h----- 

我試着用

OBS.window(SUB) 
     .withLatestFrom(SUB) 
     .switchMap(([window, status]) => { 

      if(status === F) { 
       return window.combineLatest(SUB, (cmd, status) => { 
        if(status === T) { 
         return null; 
        }; 

        return cmd; 
       }).last((e) => { 
        return !!e; 
       }) 
      } 

      return Observable.empty<Command>(); 
     }).filter((cmd) => { 
      return !!cmd; 
     }) 

來解決這一點,但它不工作

+0

如果'SUB'連續發出兩個'T',應該導致obse當'SUB'爲'F'時,仍然可以產生最後收到的值? –

+0

@SergeyKaravaev,不,但它可以固定與distinctUntilChanged – llCorvinuSll

回答

2

所以它看起來像你想要的東西LIK E:

SUB 
    // Only emit changes in the status 
    .distinctUntilChanged() 
    // Only forward true values down stream 
    .filter(t => t === T) 
    // Only emit the latest from OBS when you get a T from SUB 
    // Remap it so only cmd is forwarded 
    .withLatestFrom(OBS, (_, cmd) => cmd) 
+0

thx,它很好的起點 – llCorvinuSll

2

我找到了自己的解決方案:

OBS 
    .buffer(SUB) 
    .withLatestFrom(SUB) 
    .map(([buffer, t]) => { 
     if(!buffer || !buffer.length) { 
      return null; 
     } 

     if(t === T) { 
      return buffer[buffer.length - 1]; 
     } 

     return null; 
    }) 
    .filter((e) => !!e); 

這個變體旁邊的行爲

---a----b----c----d----e----f----g----h----- 
------F----------T------------F-------T----- 
-----------------c--------------------h----- 

,不產生輸出,如果F和T的窗口是空的

---a--------------d----e----f----g----h----- 
------F----------T------------F-------T----- 
--------------------------------------h----- 
相關問題