Angular - многократная подписка не дает одинаковый ответ - PullRequest
0 голосов
/ 07 мая 2020

У меня небольшая проблема, подписываюсь на наблюдаемый 2 раза. Вовремя у меня есть правильный результат, но с моей второй подпиской я всегда получаю тот же результат. Вот мой код:

import { Injectable } from '@angular/core';
import { BehaviorSubject, Subject, merge, EMPTY, combineLatest, Observable, of } from 'rxjs';
import { scan, map, catchError, tap } from 'rxjs/operators';
import { boatsList } from 'src/app/shared/mocks/boats.mock';
import { CatamaranModel } from 'src/app/shared/models/catamaran.model';
import { SailBoatModel } from 'src/app/shared/models/sail-boat.model';

@Injectable({
  providedIn: 'root'
})

export class BoatListService {

  private boatListInitSubject: BehaviorSubject<(CatamaranModel|SailBoatModel)[]> = new BehaviorSubject(boatsList);
  boatListInit$ = this.boatListInitSubject.asObservable();

  private addedBoatSubject: Subject<(CatamaranModel|SailBoatModel)> = new Subject();
  addedBoat$ = this.addedBoatSubject.asObservable();

  boatList$: Observable<(CatamaranModel|SailBoatModel)[]> = merge(
    this.boatListInit$,
    this.addedBoat$
  )
    .pipe(
      scan((acc: (CatamaranModel|SailBoatModel)[], value: CatamaranModel|SailBoatModel) => [...acc, value]),
    );

  constructor() {
    this.addedBoat$.subscribe(data => console.log('DATA', data));
    this.boatList$.subscribe(data => console.log('DATA AFTER ADD', data));
  }

  addBoat(boat: CatamaranModel | SailBoatModel){
    this.addedBoatSubject.next(boat);
  }
}

В этом коде this.boatlist $ .subscribe дает мне 5 объектов в моем массиве, и это хорошо.

addBoat вызывается следующим образом:

 onSubmit(){
    if (this.addBoatForm.valid){
      this.boatListService.addBoat(
        new CatamaranModel(150, 150, 564, 15, false)
      );
      this.router.navigate(['/']);
      console.log('BATEAU AJOUTE');
    }
  }

Но в этом коде:

  constructor(
    private boatListService: BoatListService
  ) {
  }

  ngOnInit(): void {
    this.boatListService.boatList$.subscribe((data) => console.log('IN THE ADD COMPONENT', data));
  }

Подписка запускается, когда это необходимо, но всегда отправляет мне старое значение (значение, используемое для инициализации).

Я не понимаю, почему у меня есть два данных для одного и того же наблюдаемого.

Если у кого-то есть идея ...

Ответы [ 2 ]

0 голосов
/ 11 мая 2020

Я наконец решил свою проблему,

После добавления я перенаправляю на другую страницу в LazyLoading.

У меня возникла проблема в модуле этой страницы (точно не знаю, что потому что я удалил и воссоздал свой файл модуля), которые перезапускают мою наблюдаемую службу каждый раз, когда эта страница загружалась.

0 голосов
/ 07 мая 2020

Это ожидаемое поведение boatListInitSubject, так как это BehaviorSubject

Один из вариантов Subjects - это BehaviorSubject, который имеет понятие «текущее значение». Он хранит последнее значение, отправленное его потребителям, и всякий раз, когда новый Observer подписывается, он немедленно получает «текущее значение» от BehaviorSubject.

...