Невозможно прочитать свойство «подписка» неопределенного в mergeMap, наблюдаемое при обновлении страницы - PullRequest
0 голосов
/ 13 июня 2018

Я сталкиваюсь с этой проблемой, когда при вызове следующего метода для подписки при обновлении страницы возникает ошибка «Не удается прочитать свойство« подписка »из неопределенного» * ​​1001 *

Вот мой импорт:

import {Observable} from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import "rxjs/add/operator/mergeMap";

Вот мой метод, который вызывает ошибку при обновлении страницы:

getChildSubItem(subItemTag:string): Observable<ChildSubItem[]> {
  return this.subItemObservers$.mergeMap(obs => {
     return obs.find(s => s.subItemTag === subItemTag)
               .viewSubItemSource.asObservable();
     });
}

У меня есть несколько свойств, которые используются для создания BehaviorSubject и Observable для BehaviorSubject.Я создал наблюдаемую для массива SubItemObservers, так как мне нужно, чтобы она была заполнена сначала через другой сервисный вызов.

private subItemObserversSource = new BehaviorSubject<SubItemObservers[]>([]);
private subItemObservers$: Observable<SubItemObservers[]> = new Observable<SubItemObservers[]>();

Вот класс для SubItemObservers:

export class SubItemObservers {
    subItemTag: string;
    viewSubItemSource: BehaviorSubject<ChildSubItem[]> = new BehaviorSubject<ChildSubItem[]>([]);;
}

На основе поиска GoogleМне нужно завершить метод, чтобы вернуть наблюдаемый объект.Но я не уверен, как это сделать с моим решением.Может кто-нибудь помочь мне, как я должен завершить подписку в методе, чтобы устранить ошибку.Что мне не хватает?Спасибо.

1 Ответ

0 голосов
/ 13 июня 2018

Во-первых, BehaviourSubject наследует Observable, поэтому, вероятно, вам не нужно 2 таких потока.

Во-вторых, rxjs6 имеет лучший способ использования pipe.

в getChildSubItem., вы можете просто позвонить this.subItemObserversSource.pipe(mergeMap...).

Как только вы инициализируете ваш subItemObserversSource = new BehaviourSubject в объявлении, вы не должны получить никаких неопределенных ошибок.

Кроме того, всегда было бы хорошодважды проверьте obs.find(s => s.subItemTag === subItemTag) в случае, если он вернет undefined.

Надеюсь, это поможет.

...