Проверка нескольких подписок до проверки состояния - PullRequest
0 голосов
/ 06 апреля 2020

Я использую ngrx и хочу убедиться, что обе подписки в моем ngOnInit () завершены, прежде чем я проверю условия и вызову методы, основанные на этих условиях.

Мой код выглядит следующим образом:

ngOnInit(){

       this.status$ = this.store.pipe(
         takeWhile(()=> this.isAlive),
         select(Selectors.getStatus)
       );

      this.process$ = this.store.pipe(
         takeWhile(()=> this.isAlive),
         select(Selectors.getProcess)
       );

       this.status$.subscribe(status => {
          this.staus = staus;

          this.status$.subscribe(process=> {
          this.process= process;

          if(!this.process.someBooleanProperty && this.status.success){
              callMethodA();
          }else if(!this.process.someBooleanProperty && this.status.error){
              callMethodB();
          }
       });
});

Я хочу убедиться, что перед тем, как проверить свое состояние, статус $ завершен, поэтому я помещаю процесс $ подписка в статус $ подписка.

Я искал способы улучшить это, и если есть какие-то операторы, которые гарантируют, что обе подписки будут завершены до оценки условия. Я наткнулся на оператор forkJoin в RxJs и реорганизовал код, используя его, как показано ниже:

ngOnInit(){

   forkJoin(
       this.status$.pipe(takeWhile(()=> this.isAlive)).pipe(tap(status => this.status = status)),
       this.process$.pipe(takeWhile(()=> this.isAlive)).pipe(tap(process=> this.process= process))
   ).susbscribe(() => {
       if(!this.process.someBooleanProperty && this.status.success){
          callMethodA();
      }else if(!this.process.someBooleanProperty && this.status.error){
          callMethodB();
      }
   }); 
}

Приведенный выше код с использованием forkJoin не работает, и отладчик даже не достигает строки кода, имеющей условие. Поскольку я бэкэнд-разработчик, изучающий интерфейс, я не могу понять причину. Пожалуйста, кто-нибудь может помочь мне определить ошибку в моем подходе. Кроме того, подход один плох?

1 Ответ

0 голосов
/ 06 апреля 2020

Я думаю, что вы хотите отслеживать текущий статус status $ и process $ из представленной вами логики c, потому что эти два потока не кажутся мне одноразовыми. Вы можете использовать combineLatest вместо

  combineLatest(
       this.status$,
       this.process$
   ).pipe(
       tap(([status,process)=>{... do you condition check and method call here and set isAlive appropriately })
       takeWhile(()=> this.isAlive)).subscribe()
...