Angular 2 - 当Http请求依赖于另一个Http请求的结果时该怎么办

时间:2016-06-15 21:48:23

标签: angular rxjs

我无法弄清楚如何使用Http请求的结果来发出另一个Http请求。

我有一个服务,它从后端API请求和接收JSON Web令牌,如下所示:

@Injectable()
export class JwtAuthorizationService {

  constructor(private http: Http) {}

  public requestToken(): Observable<string> {
    // Set dummy credentials.
    let body = this.setBody();
    let headers = this.setHeaders();
    let token = this.http.post(tokenUrl, body, { headers: headers })
      .map(this.extractData)
      .catch(this.handleError);

    // Return the Observable
    return token;
  }

  private extractData(res: Response): string {
    let body = res.text();
    return body || "";
  }

我现在如何使用requestToken()(一个Observable)的结果进行另一个API调用,使用JWT进行身份验证,并从中获取结果?或者更简单地说,当一个Http调用依赖于另一个Http调用的结果时,你会怎么做?

2 个答案:

答案 0 :(得分:4)

您可以使用flatMap运算符执行此操作:

this.authorizationService.requestToken().flatMap(token => {
  var headers = new Headers();
  headers.append('Authorization', `Bearer ${token}`);
  return this.http.get('...', { headers }).map(res => res.json());
});

您还可以通过扩展HTTP类使其透明化。在其中,您可以检查令牌的有效性,如果它已过期,请调用requestToken方法。

有关详细信息,请参阅此问题:

答案 1 :(得分:2)

如果您的网络电话需要使用之前网络电话的结果,则可以使用const combined$ = jwtAuthenticationService.requestToken() .switchMap(tokenBody => this.http.get('/someurl') ); 运营商:

// requestToken

|---------------T---| 

// second HTTP request

                   |------R--|

// combined$

|--------------------------R--|

这是大理石图:

combined$

序列如下:

  • 订阅requestToken
  • 令牌返回,首先调用observable完成
  • 获取requestToken的结果,并通过switchMap将初始Observable转换为第二个Observable
  • 如果初始观察结果尚未完成,combined$将取消订阅
  • 第二个网络调用是第二个可观察的,它使用第一个
  • 的结果
  • 第二次调用返回,第二次观察完成,while(broj2 == broj1) { broj2=Math.floor(Math.random() * 10) +1;) } while(broj3 == broj2 || broj3 == broj1) { broj3=Math.floor(Math.random() * 10) +1;) } 完成