Угловые Наблюдаемые - PullRequest
       0

Угловые Наблюдаемые

0 голосов
/ 17 января 2019

Это может быть очень простой вопрос, но я действительно застрял в этой ситуации и, похоже, не могу найти ответ в эксперименте:

Я выполняю http GET-запрос на некоторые данные. Я должен отобразить эти данные в виде «компонента», а позже мне придется «получить доступ» к этим данным (полученным из запроса http).

Так что я должен хранить эти данные в двух точках. Буду ли я просто подписываться на Observable, возвращенный из http GET-запроса дважды? Или я должен был бы подписаться один раз, сохранить ответ где-нибудь и из этого сохраненного потока данных мои два варианта использования (компонент и доступ).

Если я подписываюсь дважды, есть ли вероятность потери данных, потому что первая подписка запускает http GET, а вторая подписка "опаздывает"?

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

Я использую @ angular / core 7.0.0 и rxjs 6.3.3.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Лучший вариант - создать BehaviorSubject, связанный с вашим HTTP-вызовом.Вы инициируете HTTP-вызов с одной функцией, а затем подписываетесь на значения с другой.Поэтому вы не всегда запускаете HTTP-вызов, если не хотите.

Пример:

...
// Service
private values: BehaviorSubject<any> = new BehaviorSubject<any>(null);

subscribeValues(): BehaviorSubject<number> {
    return this.values;
}

public getValues(): void {
    this.http.get(this.URL)
      .toPromise()
      .then(res => {
        this.values.next(res);
      });
}
...

...
// Component
ngOnInit() {
  this.myService.subscribeValues().subscribe(value => {
      // whatever
  });
  this.myService.getValues();
}

BehaviorSubject всегда будет излучать последний (или первоначальное значение, которое оно имеет, когда вы подписываетесь на него.Поэтому, когда вы подписываетесь из любого компонента, вы получаете последнее значение, а из любого компонента вы можете снова вызвать API, и все, что подписано, будет обновлено.

0 голосов
/ 17 января 2019

Если я подписываюсь дважды, есть ли вероятность потери данных, потому что первая подписка запускает http GET, а вторая подписка "опаздывает"?

Это зависит от того, является ли ваша наблюдаемая «горячей» или «холодной» . Есть много ресурсов на эту тему. Но в основном hot - это когда наблюдаемое используется несколькими подписчиками, а cold - когда создается новая наблюдаемая для каждого подписчика.

Angular's httpClient.get дает вам холодную наблюдаемую. Это означает, что каждый раз, когда вы подписываетесь на него, вы запускаете новый http-запрос .

Но действительно легко преобразовать наблюдаемую холодность в горячую. Вы делаете это с помощью оператора share. Например:

this.httpClient.get("https://google.com").pipe(share())

Однако это приведет к тому, что «поздние подписчики» будут пропускать уведомления. Если у вас есть два подписчика и вы хотите, чтобы они оба получили гарантированное уведомление, вы должны использовать shareReplay(1)

this.httpClient.get("https://google.com").pipe(shareReplay(1))

Это кэширует последнее уведомление и передает его каждому подписчику при подписке, гарантируя, что вы вызываете HTTP только один раз, и каждый подписчик получает результат.

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