【问题标题】:Chaining http calls on angular2 using observables使用 observables 在 angular2 上链接 http 调用
【发布时间】:2016-11-14 02:07:26
【问题描述】:

我有一个 angular2 应用程序,该应用程序具有一个服务,该服务发起一个 HTTP 调用,该调用具有不同的订阅者(每个订阅者显示不同的信息)。 第一次调用完成后,我需要进行第二次独立的 HTTP 调用,并根据检索到的值过滤从 first 调用获得的数组。 它不工作,第二个 HTTP 调用的订阅者不知道等待,我得到一个空列表,因为第一个调用的数组还不存在

我正在附加相关服务

constructor(private http: Http) {
    this.initializeAlertService();
    console.log('Started alerts service');
   }

   initializeAlertService() {
        if (!this.allData$) {
          this.allData$ = <BehaviorSubject<Alert[]>> new BehaviorSubject(new Array<Alert>());

          this.http.get(this.url)
            .map((res:Response) => res.json())
            .catch((error:any) => Observable.throw(error || 'Server Error'))
            .subscribe(
              allData => {
                this.allData = allData;
                this.allData$.next(allData);
                this.initializeAlertSeverities(); -- I want this to fire when the 'allData' is ready
              },
              error => console.log("Error subscribing to AlertService: " + error)
            );
        }
  }

subscribeToAlertSeverities(): Observable<AlertSeverity[]>  {

    return this.alertSeverities$.asObservable();
  }

然后在我的组件上我订阅了 alertSeverities,但我没有得到数据......

【问题讨论】:

标签: angular rxjs observable


【解决方案1】:

我能够通过将 http 调用的结果传递给代码订阅部分中的函数来解决这个问题

constructor(private http: Http) {
    this.initializeAlertService();
    console.log('Started alerts service');
  }

  initializeAlertService() {
    if (!this.alerts$) {
      this.alerts$ = <BehaviorSubject<Alert[]>> new BehaviorSubject(new Array<Alert>());
      this.alertSeverities$ = <BehaviorSubject<AlertSeverity[]>> new BehaviorSubject(new Array<AlertSeverity>());

      this.http.get('first url')
      .map((res:Response) => res.json())
      .subscribe(alerts => {
        this.alerts$.next(alerts);
        this.initializeAlertSeverities(alerts);
      })
    }
  }

  initializeAlertSeverities(alerts){
    this.http.get('second url')
    .map((res:Response) => res.json())
    .catch((error:any) => Observable.throw(error || 'Server Error'))
    .subscribe(
      severities => {
        severities.map((severity) => {
          var severityCounter = alerts.filter(alert => alert['severity'] == severity.severityValue).length;
          severity.severityCount = severityCounter;
        });

        this.alertSeverities$.next(severities);
      },
      error => console.log("Error subscribing to Alert Severities: " + error)
    );
  }

  subscribeToAlertSeverities(): Observable<AlertSeverity[]>  {
    //actual subscriber that components subscribe to
    return this.alertSeverities$.asObservable();
  }


  subscribeToAlertService(): Observable<Alert[]> {
    return this.alerts$.asObservable();
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 2016-05-18
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多