RxJS函数从一个observable发出最后一个值然后发出true

RxJS函数从一个observable发出最后一个值然后发出true

问题描述:

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

所以它看起来像你想要的东西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

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

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-----