Как ждать, пока не будет создан Observable Observer - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь построить систему обмена сообщениями с Observable.Мой код выглядит так, довольно просто.Но у меня есть проблема с ползунком, иногда метод newMessage вызывает до того, как storageObserver , и я получаю эту ошибку

Невозможно прочитать свойство 'next' изnull

  private storageObserver: any;
  public storage: any;

  constructor(private auth: AuthenticationService, private http: HttpClient) 
  {
    this.storage = Observable.create(observer => {
      this.storageObserver = observer;
    });
  }

  newMessage(message: any) {
    this.storageObserver.next(message);
  }

Очевидно, я могу проверить newMessage вот так

newMessage(message: any) {
    if(this.storageObserver == null) {
      setTimeout(() => {
         this.storageObserver.next(message);
      }, 500)
    } else {
      this.storageObserver.next(message);
    }
}

Но я не очень люблю этот тип хаков.Можно ли как-нибудь дождаться создания наблюдателя?

1 Ответ

1 голос
/ 01 июня 2019

Я подозреваю, что вы хотите иметь возможность «кормить» наблюдаемое вручную столько времени, сколько вы хотите, но для этого есть другой подход.

Я предпочитаю писать так:

private storageSubject: Subject<any>;

constructor(private auth: AuthenticationService, private http: HttpClient) {
    this.storageSubject = new Subject<any>();
    this.storage$ = this.storageSubject.asObservable(); 
}

// This is a public observable that can be subscribed to.
// Do not forget to unsubscribe.
storage$: Observable<any>;

newMessage(message: any) {
    this.storageSubject.next(message);
}

Пример StackBlitz

Примечание. Если вы хотите, чтобы наблюдаемое имело начальное значение, вы можете использовать BehaviorSubject<any>. Он всегда будет давать последнее значение сразу после подписки, что может быть более полезно, если вы хотите, чтобы значение имело некоторую форму состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...