Rxjs函数与两个可观察对象的结合使用

时间:2018-10-04 15:08:13

标签: typescript rxjs observable rxjs-pipeable-operators

我想用一个可观察的动作执行某项操作,例如将20加到其属性之一

const mainObservable = of({id:1, count: 20});
const example = mainObservable.pipe(
    map(val=> { val.count+20; return val;})
);

然后我需要检查其他可观察的条件,如果它是真的,则执行进一步的操作,例如将40添加到第一个可观察的属性之一

组合代码:

const mainObservable = of({id:1, count: 20});

const otherObservable = of([10,20]);
const example = mainObservable.pipe(
  map(val=> { val.count+20; return val;}),
  switchMap(outerVal => otherObservable.pipe(map(val=>{
     console.log(outerVal);
     return val.length > 0;
     }))),
 // map(val=> {val.count+ 40, return val})

);

在这里,如果otherObservable的条件为true,那么我需要在计数中加40,最后在订阅中,我应该获得第一个可观察的实际对象。

有人可以帮我解释一下吗?为了达到要求,应该引入注释代码,以便

observable示例应从第一个observable发出对象

StackBlitz

2 个答案:

答案 0 :(得分:1)

似乎您要根据所需的逻辑来寻找运算符combineLatestwithLatestFrom。例如,使用withLatestFrom可以这样:

const example = mainObservable.pipe(
  map(val => {
    val.count + 20;
    return val;
  }),
  withLatestFrom(otherObservable),
  map(([first, second]) => {
     console.log(first, second);
     return second.length > 0;
  }),
);

只有当mainObservable发出时,它才会从otherObservable中获取最新值,您可以用它来做任何您想做的事情。

实时演示:https://stackblitz.com/edit/rxjs-jnmehl?file=index.ts

答案 1 :(得分:1)

这是更新的堆叠闪电战,其中包含您的预期结果。

const example = mainObservable.pipe(
  map(val=> { val.count += 20; return val;}),
      switchMap(outerVal => otherObservable.pipe(map(val=>{
         if(val.length){
           outerVal.count += 40;
         } 
         return outerVal;
         })
      )),
     // map(val=> {val.count+ 40, return val})

    );

https://stackblitz.com/edit/rxjs-tf8r4p