Firebase Query или Observable, дающие неправильные результаты при первом вызове после отписки и повторной подписки или - PullRequest
0 голосов
/ 11 октября 2018

У меня есть абстрактный класс обслуживания, который в основном обрабатывает подписки на запросы с различными параметрами.Как подписчик, вы просто хотите подписаться один раз, и на самом деле все равно, будут ли изменены параметры запроса.

export abstract class BroadcastService<T>{

  results: Observable<T[]>;

  fb: FirebaseService;
  config: ConfigurationService;

  protected constructor (fb: FirebaseService, config: ConfigurationService) {
    this.fb = fb;
    this.config = config;
    this.results = this.broadcaster.asObservable();
    this.updateSubscription();
  }

  protected broadcaster: Subject<T[]> = new Subject();
  protected params: any;
  protected currentQuerySubscription: Subscription;

  protected resultList: any[];

  protected updateSubscription() {
    if (this.paramsRequired() && this.params == null) {
      return;
    }
    if (this.currentQuerySubscription != null) {
      this.currentQuerySubscription.unsubscribe();
    }
    this.currentQuerySubscription = this.resultsQuery(this.params).subscribe((objs) => {
        this.broadcaster.next(objs);
        this.resultList = objs;
    });
  }

  setParams(params: any) {
    this.params = params;
    this.updateSubscription();
  }

  protected abstract resultsQuery(params: any): Observable<T[]>;
  protected abstract paramsRequired(): boolean;
}

То, что это в основном делает, - другой компонент может подписаться на результаты.Другие компоненты могут изменять параметры ResultsQuery, не вынуждая существующих подписчиков повторную подписку, поскольку их подписка на тему не уничтожается.Только внутренне, если параметры обновляются, подписка на старый запрос сбрасывается, и класс внутренне подписывается на новый запрос и начинает отправлять эти результаты.

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

protected resultsQuery(params: any): Observable<TreeNodeDocument[]> {
  return this.afs.collection<TreeNodeDocument>(
    this.resolveCustomer(), ref => 
    ref.where('someId', '==', params['someId'])).valueChanges();
}

Запрос довольно стандартный и просто возвращает наблюдаемый набор интересующих нас узлов. Afs имеет тип AngularFirestore (библиотека, которую я использую).

Теперь проблема заключается в следующем: после того, как яunsubscribe() обработчик для this.resultsQuery(this.params).subscribe вызывается немедленно с 1 результатом (неверно), а затем немедленно вызывается снова с 17 результатами (верно).

Если я снова изменяю параметры, я получаю 1 результат (неправильно)и затем сразу 24 результата (справа).

Если я раскомментирую весь блок

if (this.currentQuerySubscription != null) {
   this.currentQuerySubscription.unsubscribe();
}

, это прекращается, и я получаю только правильные результаты (не неправильные вызовы с 1 результатом между).Конечно, это плохо с тех пор, как теперь, если что-то в firebase изменяется, обработчик вызывается несколько раз, так как я не удаляю старые подписки.

Теперь мой вопрос: что мне не хватает, ... или чтообъяснение такого поведения?

...