【问题标题】:Angular 2 - What to do when an Http request depends on result of another Http requestAngular 2 - 当一个 Http 请求依赖于另一个 Http 请求的结果时该怎么办
【发布时间】:2016-06-15 21:48:22
【问题描述】:

我无法弄清楚如何使用 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 调用的结果时,你会怎么做?

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    您可以使用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 方法。

    查看这个问题了解更多详情:

    【讨论】:

    • 我尝试使用flatMap(),但在编译时不断收到Property 'flatMap' does not exist on type 'Observable&lt;string&gt;'.。这是因为我的requestToken() 方法在成功时将令牌作为字符串返回?
    • 事实上,这是因为 flatMap operator i 是 mergeMap one 的别名 ;-) 你需要这样导入它: import 'rxjs/add/operator/mergeMap';
    • flatMap 和 switchMap 的区别在于第一个不是之前的 in-progress observable/request。在你的情况下就足够了。 SwitchMap 对于自动补全特别有用(例如)
    【解决方案2】:

    例如,如果您的网络调用需要使用先前网络调用的结果,您可以使用 switchMap 运算符:

    const combined$ = jwtAuthenticationService.requestToken()
        .switchMap(tokenBody => this.http.get('/someurl') );
    

    这是大理石图:

    // requestToken
    
    |---------------T---| 
    
    // second HTTP request
    
                       |------R--|
    
    // combined$
    
    |--------------------------R--|
    

    顺序是这样的:

    • 订阅 requestToken 发生
    • token 返回,首次调用 observable 完成
    • 获取 requestToken 的结果,并通过 switchMap 将初始 Observable 转换为第二个 Observable
    • 如果最初的 observable 没有完成,combined$ 会取消订阅它
    • 为第二个网络调用创建第二个 observable,它使用第一个的结果
    • 第二个调用返回,第二个 observable 完成,combined$ 完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多