Angular 5 http.get 成一个 BehaviorSubject 以多播客户端上的数据变化

Angular 5 http.get into a BehaviorSubject to multicast data changes on the client

我有一个使用 restful wcf 网络服务的 angular 5 网站。反过来,Web 服务与与数据库对话的业务对象进行交互。我正在使用 @angular/common/http 模块将 Web 服务消费到一个可观察的对象中,然后在网页上呈现。到目前为止一切顺利。

现在,我也在通过网络服务更新数据库,这也工作正常。

但是,它有点慢,我希望能够在更新 Web 服务调用的同时直接更新 Observable,这样网站就不必等待数据通过Web 服务,通过极其缓慢的企业资源规划业务对象,到数据库,然后返回到 Observable 对象,通过异步管道更新屏幕。

所以,我心想,为什么不直接用 BehaviorSubjects 替换 Observables 呢?然后,我可以只使用 BehaviorSubject 上的 "next" 方法来快速更新页面。

但是,当我尝试...

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[]>'.```

现在,错误是有道理的,但它让我退后一步想知道:实现我的目标的最佳方法是什么?

您想要一个可以让您将客户端更新注入流中的主题,并且您希望将这个主题与从服务器流式传输数据的可观察对象合并。

像这样:

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)

时收到更新