Наблюдаемые цепочки RxJ в Angular

Я использую RxJs 6.6.0 и Angular 9.

У меня есть две функции, которые возвращают Observable ‹'Class1'› и Observable ‹'number'›.

поэтому я использую для:

funcA().subscribe(x=>{ // do something...});

funcB().subscribe(x=>{// do somethings..});

Но мне нужно вызывать funcB только после завершения funcA (). Я понимаю, что concat может быть полезен, но я не могу получить два таких ответа

concat(funcA,funcB).subscribe( (x,y)=>{// do with x
//do with y});

Я хотел бы сделать это, потому что параметры funcB зависят от возврата funcA.


person Arno    schedule 13.08.2020    source источник


Ответы (2)


Для этого используйте switchMap из rxjs / operator.

this.sub = funcA()
  .pipe(
    switchMap(valueFromA => {
      // use valueFromA in here.
      return funcB()
    })
  )
  .subscribe();
person Varit J Patel    schedule 13.08.2020
comment
Зачем использовать switchMap? - person Rafi Henig; 13.08.2020
comment
Потому что: при каждой эмиссии предыдущий внутренний наблюдаемый объект (результат предоставленной вами функции) отменяется и подписывается новый наблюдаемый объект. - person Varit J Patel; 13.08.2020
comment
В случае mergeMap внутреннюю подписку нужно контролировать вручную. При использовании switchMap она автоматически отменяется. Это помогает избежать проблемы с утечкой памяти, если вы забудете отказаться от подписки вручную. MergeMap Docs - person Varit J Patel; 13.08.2020
comment
@VaritJPatel valuefromA необходимо присвоить полю объекта, который я передаю funcB, и не указывать значение напрямую. Remeber, чем FuncB, возвращает наблюдаемый - person Arno; 13.08.2020
comment
@RafiHenig Я использую наблюдателя, чтобы получить только одно значение из разрабатываемого мной остального API - person Arno; 13.08.2020
comment
@Arno Я показал вам, как вы можете использовать значение valuefromA для вызова funcB (). - person Varit J Patel; 13.08.2020
comment
@rafihenig - что вы имеете в виду, когда obsA никогда не будет излучать снова, когда вы используете switchMap ..? Я действительно не понимаю этого утверждения .. - person MikeOne; 13.08.2020
comment
хотя в этом случае funcA излучает только один раз (HTTP-запрос), поэтому нет необходимости в switchMap - person Rafi Henig; 13.08.2020

Попробуйте реализовать это следующим образом:

import {  mergeMap } from 'rxjs/operators';

funcA()
  .pipe(
     mergeMap(valueFromA => {
         funcB({value: valueFromA }))
     }
   )
  .subscribe(console.log);
person Rafi Henig    schedule 13.08.2020
comment
Я не могу использовать возврат funcA, и мне нужно присвоить это значение объекту, который я передаю funcB - person Arno; 13.08.2020