Angular6 http.get从调用中提取ID以在另一个中使用

时间:2018-08-20 14:17:55

标签: angular rest api typescript

我想打电话给我的REST检查ServiceProvider ID,然后在另一个电话中使用该ID。 我有一个名为 GetServiceProviderId()的方法,它将调用API并获取以下Json结果:{     “ mitId”:18,     “ ServiceProviderId”:“ 2” }

现在我想将2放入另一个呼叫中,以使用 GetInstallation()

填充列表

这是我当前的代码:

  GetServiceProviderId() {
    return this.http.get<Info>(this.rooturl + 'info', { headers: this.reqHeader }).subscribe(res => {
      res.ServiceProviderId
    })
  }

这就是我要使用2的地方:

  GetInstallation() {
    return this.http.get<Installation[]>(this.serviceurl +
      "2"
      , { headers: this.reqHeader })
  }

如果我用this.GetServiceProviderId()替换“ 2”,则会出现以下错误:GET localhost:50159 / installation /?serviceproviderid = [object%20Object] 400(错误请求)

感谢阅读

1 个答案:

答案 0 :(得分:0)

您可以使用flatMap。它将首先调用GetServiceProviderId(),当解析时将调用您的下一个可观察对象(http get)。使用Observables时,一切都是懒惰的,这意味着您没有在处理具体的价值。在调用.subscribe()之前,代码不会执行。一开始这是一个很奇怪的概念,老实说需要时间和实践才能使您的大脑包住它。

http://reactivex.io/documentation/operators/flatmap.html

 GetServiceProvider() : Observable<Info> {
    return this.http.get<Info>(this.rooturl + 'info', { headers: this.reqHeader });
  }

GetInstallation() : Observable<Installation[]> {
    return this.GetServiceProvider().pipe(
        flatMap(info => {
            // ^^ this info object is the result of GetServiceProviderId()
            return this.http.get<Installation[]>(this.serviceurl +
            info.serviceProviderId
          , { headers: this.reqHeader })
        })
);

编辑: 我刚刚意识到您的GetServiceProviderId()函数正在调用http.get,然后进行订阅。我将对此进行重构,并从此方法中删除.subscribe()。将其留给使用者以将ID从信息对象中拉出。

编辑:此外,如果您可以控制API,请考虑将其压缩为一个调用。在这种情况下,您必须从浏览器到API进行2次往返。即使这意味着从您的服务器调用不同的WebAPI,因为这样做的可能性更大。您永远不会知道用户连接的速度如何,因此对他们来说这两个呼叫可能需要5秒钟才能运行,但对您而言则可能需要250毫秒。但是,如果您使用“服务器到服务器”检索ServiceProviderId,则调用可能只花费他们2秒的时间,因为他们的Web请求减少了一个。