Как отправить данные подписчику без использования метода HTTP? - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть этот код в моем приложении:

  public requestList(): Observable<Record[]> {
    return this.http.get(this.requestUrl)
      .map((response: any) => this.currentList = response.json())
      .catch(this.setError);
  }

Хотелось бы, чтобы этот список загружался только один раз из моего бэкэнда. Поэтому мне нужно проверить, заполнен ли currentList. Если это так, я должен игнорировать http.get() и вручную возвращать содержимое currentList подписчику, прозрачно, как если бы он получал его из бэкэнда. Как мне этого добиться?

  public requestList(): Observable<Record[]> {
    if (this.currentList !== undefined) {
      // MAGIC HERE: returning content that's already in this.currentList HOW?
    }
    return this.http.get(this.requestUrl)
      .map((response: any) => this.currentList = response.json())
      .catch(this.setError);
  }

1 Ответ

0 голосов
/ 27 апреля 2018

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

Пример:

...
if (this.currentList !== undefined) {
  return Observable.of(this.currentList);
}
...

Вот несколько документов по нему: реактивный x.io , learn-rxjs

Также может быть более целесообразно использовать оператор do/tap для изменения состояния чего-либо вне потока, поскольку вы на самом деле не собираетесь возвращать значение, отличное от map.

Пример:

...
return this.http.get(this.requestUrl)
  .do((response: any) => this.currentList = response.json())
...

Вот несколько документов: learn-rxjs

Edit:

Нашел еще один похожий пост, в котором говорится об избежании дублирования запросов в полете, а также о кешировании. Поэтому для дальнейшего обсуждения этой темы вы можете проверить это: Как правильно передать результат сетевого вызова Angular Http в RxJs 5?

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