同步处理Observable以防止使用rxjs Angular和ngrx超时的HTTP请求过多

时间:2018-05-02 17:32:56

标签: angular rxjs observable rxjs5 ngrx

我有以下代码。它得到一个患者数组并构建一个行对象java,我在这个角度4组件的frontEnd上的表中显示(我也使用rxjs 5.5)。

我的问题是每行的hasAlert属性是通过调用hasAlerts()来分配的。在HasAlerts方法中,我通过this.rows为每位患者发出http请求。

当有很多患者时,太多的HTTP请求将异步发生,并且它们将从HasAlerts()开始失败(超时)。有没有办法限制它,或者从hasAlerts()一次处理一个Observable?

以下是解决此问题的可能方法

  1. 我认为concatMap可能会有所帮助,但我不知道如何使用它。还应该使用它来处理每个患者/行,或者应该尝试将每个hasAlert()observable聚合到一个列表中,然后尝试使用concatMap一次处理一个?
  2. 一个解决方法是使用注释//添加的patientsAlertsProcessed变量包装器来完成限制hasAlertsMethod。我将其限制为仅触发该方法15次以避免超时问题。这并不理想,因为一旦这15个异步请求完成,我就无法重新启动它。
  3. 代码低于

    this.dataService.fetchItems<Observation>(

1 个答案:

答案 0 :(得分:2)

你可能想尝试这些方法。

const concurrency = 10; 
const rowsWithAlerts = [];

this.patients$.debounceTime(2000)
.switchMap(patients => Observable.from(patients)) // patients is of type Patient[]
.mergeMap(patient => {
   rowsWithAlerts.push(patient);
   this.hasAlerts(patient).do(
   hasAlertsResult => {
     // here you have hold to both the patient and the result of
     // hasAlerts call
     patient.hasAlerts = hasAlertsResult;
   }}), concurrency)
.subscribe(
   () => this.rows = rowsWithAlerts;
)

这里的关键是使用mergeMap运算符并将并发级别设置为一个值,在本例中为10但显然可以是任何值。

这允许限制您同时订阅的可观察数量,在您的情况下,这意味着限制您进行的http呼叫数量。