При использовании подписки и асинхронного канала различаются результаты - PullRequest
1 голос
/ 08 июня 2019

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

По сути, моя наблюдаемая использует оператор сканирования для накопления данных, извлекаемых из базы данных. У него есть 2 метода: init, чтобы получить первые данные и установить наблюдаемый с начальными данными, и addData, который выбирает больше данных.

После запуска службы и добавления некоторых данных, если я ее снова инициирую, она не будет сбрасывать данные при использовании обычной подписки. Но если используется асинхронный канал, служба сбрасывает данные, как и ожидалось. Почему подписка и асинхронный канал имеют разное поведение, когда ожидается, что они будут одинаковыми?

Я создал упрощенное воспроизведение ошибки в stackblitz:

https://stackblitz.com/edit/angular-3vroi2

При нажатии кнопки «сброс данных» возврат из подписки не сбрасывается. И те же данные, возвращаемые асинхронным каналом, соответственно сбрасываются.

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

1 Ответ

0 голосов
/ 08 июня 2019

Проблема лежит здесь:

 this.data = this._data.asObservable().pipe(
      scan( (acc, val) => {
        return acc.concat(val)
      }, []),
      shareReplay(1)
    )

Это утверждение не оказывает никакого влияния на подписчиков, которые уже подписались на старое значение this.data - например, на вашу ручную подписку в child.component - они останутся подписанными на старое значение.

С другой стороны, ваш асинхронный канал подписывается на любое значение, которое хранится в page.data в данный момент.

<li *ngFor="let item of page.data|async">{{item}}</li>

Таким образом, когда вы устанавливаете page.data в новое Observable, асинхронный канал отписывается от старого (Observable) значения page.data и подписывается на новое (Observable) значение.

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