我想打电话给我的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(错误请求)>
感谢阅读
答案 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请求减少了一个。