Длинный опрос Angular RXJS

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

Извлечение данных из бэкенда осуществляется через длинный опрос, реализованный в сервисе.

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

с текущей имплантацией POM обновляется при каждом попадании. Есть способ решить??

Я попробовал следующий код:

В моем html-шаблоне:

<div *ngFor="let message of messages$ | async">
{{message}}
</div>

в файле компонентов ts:

messages$ = storeService.messages;
ngOnInit(){
this.messages$.subscribe();
}

в сервисе магазина:


  get messages(): Observable<any> {
    return this._messages.asObservable();
  }
 
  private _messages = new BehaviorSubject<any[]>([]);
 
  messages$ = this._messages.asObservable()

 storeGet$ = this.http.get(EndPoint)
getStore(){
return timer(0, 15000).pipe(
        concatMap(() => storeGet$),
        map(resp => {
 
          this._messages.next(resp['messages'])
        })
      )
}

person halakoukeh    schedule 22.06.2020    source источник


Ответы (2)


Все что тебе нужно это

messages$ = timer(0, 15000).pipe(
  switchMap(_ => this.http.get(EndPoint)),
  map(resp => resp['messages'])
)
person Adrian Brand    schedule 22.06.2020
comment
Мне нужно сохранить этот опрос в сервисе, так как многие другие компоненты будут его использовать. - person halakoukeh; 23.06.2020
comment
Это то, что вы помещаете в службу, возможно, добавляете shareReplay() в конце потока, если нескольким компонентам нужны последние результаты пула. - person Adrian Brand; 24.06.2020

Ошибка в переменной ngFor let. ngFor должен выглядеть примерно так

<div *ngFor="let message of messages$ | async">
    {{message}}
</div>
person Jaime Alejandro    schedule 22.06.2020