我要做2个http请求。第一个http请求返回url列表和一些字符串。然后我需要在这个url上发出另一个http请求以获取anther数据,并使用我从第一个http请求获得的字符串附加此数据。
我应该如何在angularJs2中执行此操作
现在我可以使用observable发出第一个http请求,但我仍然遇到了第二个http请求。
我一直在研究observables,flatmap和mergemap,但我对angular2和observable都不熟悉,这有点混乱。
所以我的问题是将这两个请求链接起来的最佳方法是什么?
答案 0 :(得分:1)
这个答案并非针对Angular,而是主要展示了如何将Reactive运算符链接在一起以获得所需内容。您可以执行以下操作(警告:未经测试的代码):
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switch';
export class Foo {
bar() {
const httpClient: HttpClient = /* Your HTTP client here */;
httpClient
.get<UrlAndString[]>('first url')
.map(urlsAndStrings => {
const parameter = doSomethingWithUrlsAndStrings(urlsAndStrings);
return httpClient
.get<SecondResult>(`second url?param=${parameter}`)
.map(secondResult => { return [urlsAndStrings, secondResult]; });
})
.switch()
.subscribe(tuple => {
console.log(tuple[0]); // The urls and strings, of type UrlAndString[].
console.log(tuple[1]); // The second result, of type SecondResult.
});
}
}
import
语句会引入map
和switch
运算符,以便您可以将它们链接起来。
map
会在事件发生时对其进行转换,因此您可以看到,当第一个.get()
返回某个内容时,它会映射到另一个Observable<T>
。因此,第一个map
函数的类型签名将为map<UrlAndString[], Observable<[UrlAndString[], SecondResult]>>
。这意味着它将返回发布Observable<Observable<[UrlAndString[], SecondResult]>>
的{{1}}或Observable
,其中Observable
发布UrlAndString[]
和SecondResult
类型的元组。
switch
需要Observable<Observable<T>>
并将其转换为Observable<T>
。我上面链接的文档比我更好地解释了它。但是您可以看到.switch()
的返回类型为Observable<[UrlAndString[], SecondResult]>
。
您可能已经熟悉.subscribe()
。