Использование функций Rxjs с двумя наблюдаемыми

Я хочу выполнить какое-то действие с одним наблюдаемым, скажем, добавить 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 истинно, мне нужно добавить 40 к счету, и, наконец, при подписке я должен получить фактический объект первого наблюдаемого.

Может ли кто-нибудь помочь мне с этим вместе с объяснением? Код с комментариями должен быть введен для выполнения требования, чтобы

пример наблюдаемого должен испускать объект из первого наблюдаемого

StackBlitz


person Shoaib Chikate    schedule 04.10.2018    source источник


Ответы (2)


Похоже, вы ищете операторы combineLatest или withLatestFrom в зависимости от того, какую логику вы хотите. Например, с 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

person martin    schedule 04.10.2018
comment
Но все же подписка на примере возвращает мне истину, она должна возвращать тот объект, который изменен - person Shoaib Chikate; 04.10.2018
comment
Тогда просто return first; вместо return second.length > 0 - person martin; 04.10.2018

Вот обновленный stackblitz с вашим ожидаемым результатом.

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

person Suresh Kumar Ariya    schedule 04.10.2018