2017-08-28 26 views
0

我对Angular 4和Observables以及与它相关的所有东西都很陌生。 我试图一个接一个地执行两个http请求(只有第一个成功)。Angular(4):带有Observable的多个HTTP请求:一个接一个成功

我使用这个代码:

public getCompany(id: string): any { 
    let company = null; 

    this.authService.isValidUser().subscribe(response => { 
     const token = this.tokenStorageService.getTokenFromStorage(); 
     const requestUrl = environment.gatewayUrl + environment.companyService + environment.getCompanyEndPoint + id; 
     const headers = new Headers(); 
     headers.set('Authorization', 'Bearer ' + token); 
     const options = new RequestOptions({headers: headers}); 

     return this.http.get(requestUrl, options).catch(this.errorService.handleError); 

    }, (error: AppError) => { 
     // ........ // 
    }); 
    } 

这是isValidUser()方法代码:

public isValidUser(): any { 
    const token = this.tokeStorageService.getTokenFromStorage(); 
    if (!token) { 
     console.log('cannot find token'); 
     return false; 
    } 

    const requestUrl = environment.gatewayUrl + environment.authorizationService + environment.userServiceEndPoint; 
    const headers = new Headers(); 
    headers.set('Authorization', 'Bearer ' + token); 
    const options = new RequestOptions({headers: headers}); 

    return this.http.get(requestUrl, options).catch(this.errorService.handleError); 
    } 

的这里的想法是只返回return this.http.get(requestUrl, options).catch(this.errorService.handleError);authService.isValidUser()代码工作后。

我不认为这是执行此类请求的正确方式,因为我的第二个请求在第一个请求之前已经完成。

也许我错过了如何正确使用它的一些方法?

谢谢。

+0

'因为我的第一个请求已经完成之前,第二个'' - 这是你正在尝试做什么,不是吗? – TheUnreal

+0

呃我的错。第二个在第一个请求完成之前完成 –

+0

在您的代码中,第一个在第二个之前完成...第一个请求的结果是“响应”。 – TheUnreal

回答

1

代码在哪里试图链接这两个函数?

你可以使用switchMap运算符来实现你想要的。这里是docs

我想你需要的东西是这样的:

isValidUser() 
    .filter(isValidUser => isValidUser) // <-- perhaps you need this filter since you want to make getCompany call only if user is valid 
    .switchMap(() => getCompany()) 
    .subscribe(...do something...); 

不要忘记添加import 'rxjs/add/operator/switchMap';。您也可以使用mergeMapflatMapmergeMapflatMap的synonim),但它不是优选的。

As @BeetleJuice在评论中提到:为什么switchMap更好?例如,您使用mergeMap或flatMap,并且导致另一个该代码的调用。即使两个第一个请求没有完成,新的请求也会被发送。第二批请求甚至有可能比第一批请求更快完成。之后,第一个包完成,你有你的状态错误的数据。为了解决这个RxJS提供了完美的运营商switchMap。如果你在上面的情况下使用了这个操作符,那么第一个observable(第一个请求包)将被取消。只有最后一次观察(来自上次调用)才会保持活跃状态​​。只有在有可能在短时间内多次运行该代码时,才需要switchMap。如果您知道此代码将只运行一次mergeMap/flatMap将为您执行相同操作。

另外,请查看this post

+0

我没有链码。这是问题 –

+0

酷。那就是答案。 –

+3

Sharikov,@DenissM。 'switchMap'是比mergeMap更好的选择,因为在这个用例中,你希望保持执行的顺序 - 第二个http请求只能在第一个请求解决后才能生成。 'mergeMap'允许多个第一类请求被缓冲的第二个请求通过线传输的可能性。 – BeetleJuice