Angular4 - 嵌套的Http调用

时间:2017-08-28 20:23:48

标签: javascript angular rxjs

我在角度中使用http嵌套调用。

首先致电获取令牌。 第二次调用将使用令牌并返回实际数据。

[a-z0-9A-Z.-]+

该函数返回 public get(api) { return this.http.get(this.url + '/token') .map(res => res.json()) .toPromise() .then((data: any) => { this.access_token = data.access_token let headers = new Headers(); headers.append('Authorization', 'Bearer ' + this.access_token); return this.http.get(this.url + api, { headers: headers }).map(res => res.json()); }) } 。如何解析响应,以便我可以从订阅中的嵌套调用中获取数据。

Promise<Observable<any>>

1 个答案:

答案 0 :(得分:5)

您可以使用switchMap之类的RxJS运算符来简化此嵌套调用,而无需使用toPromise()

  

映射到可观察的,完整的先前内部可观察值,发出值。

您实际上是将第一个observable的发射值传递给下一个observable(第二个HTTP调用)。这允许您在使用示例中订阅最终结果。

重要的是,在switchMap()return内部的observable,在这种情况下,HTTP调用才能有效地发挥作用。

正如其他人所指出的那样,toPromise()不是必需的,因为您可以利用RxJS运算符来完成此异步,依赖操作。

public get(api) {
  return this.http.get(this.url + '/token')
    .map(res => res.json())
    .switchMap(data => {
        this.access_token = data.access_token;
        let headers = new Headers();
        headers.append('Authorization', 'Bearer ' + this.access_token);

        return this.http.get(this.url + api, { headers: headers });
    })
    .map(res => res.json());
}

<强>使用

this.get('me/profile').subscribe(data => console.log(data));

注意:使用Angular 4+ HttpClient时,您无需在响应中明确调用json(),因为它会自动执行此操作。

希望这有帮助!