Angular 5 http.get в BehaviorSubject для многоадресной передачи данных на клиенте - PullRequest
0 голосов
/ 02 мая 2018

У меня есть угловой веб-сайт, который использует спокойный веб-сервис wcf. Веб-служба, в свою очередь, взаимодействует с бизнес-объектами, которые общаются с базой данных. Я использую модуль @ angular / common / http для превращения веб-сервиса в наблюдаемый объект, который затем отображается на веб-странице. Пока все хорошо.

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

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

Итак, я подумал про себя, почему бы просто не заменить Observables на BehaviorSubjects? Затем я мог бы просто использовать метод «next» в BehaviorSubject для быстрого обновления страницы.

Но когда я попробую это ...

public cartons$: BehaviorSubject<ICartonTrackDetail[]>;
this.cartons$ = this.cartonService.getCartonsObservable();

Я получаю эту ошибку ...

Type 'Observable<ICartonTrackDetail[]>' is not assignable to type 'BehaviorSubject<ICartonTrackDetail[]>'.
  Property '_value' is missing in type 'Observable<ICartonTrackDetail[]>'.```

Теперь, ошибка имеет смысл, но заставляет меня отступить и задуматься: как лучше всего достичь моей цели?

1 Ответ

0 голосов
/ 03 мая 2018

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

Примерно так:

private clientStream$ : Subject<ICartonTrackDetail[]>;

public cartons$ : Observable<ICartonTrackDetail[]>;

// setup
const serverStream = this.cartonService.getCartonsObservable();
this.clientStream$ = new Subject<ICartonTrackDetail[]>();
this.cartons$ = serverStream.merge(this.clientStream$);

// when you get new data to send to server:
this.clientStream$.next(newData);
.. add code to send newData to server like normal ..

Теперь любой код, подписывающийся на cartons$, будет получать обновления, когда вы звоните clientStream$.next(newData)

...