我对Angular 4及其Observables
相关的所有事物都是新手。我试图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()
代码工作后返回。
我认为这不是执行此类请求的正确方法,因为我的第二个请求已在第一个请求之前完成。
也许我缺少正确执行操作的方法?
谢谢。
您试图将这两个功能链接在一起的代码在哪里?
您可以使用switchMap
运算符实现所需的功能。这是文档。
我认为您需要这样的东西:
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';
。您也可以使用mergeMap
或flatMap
(mergeMap
是synonim的flatMap
),但不是首选。
正如@BeetleJuice在评论中提到的:为什么switchMap
更好?例如,您使用mergeMap或flatMap,并且某些原因导致再次调用该代码。即使两个请求尚未完成,也会发送新的请求。甚至有可能第二个请求束比第一个请求束完成得更快。在第一个捆绑包完成后,您的状态中的数据错误。RxJS为解决此问题提供了完善的运算符switchMap
。如果您在上述情况下使用了此运算符,则第一个可观察到的(第一个请求束)将被取消。只有最后一个可观察到的(来自上次呼叫)才能保持活动状态。仅当您有可能在短时间内多次运行该代码时,才需要switchMap。如果您知道此代码将仅运行一次mergeMap
/flatMap
将为您执行相同的操作。
另外,请查看此帖子。
2020年3月28日更新:使用新版本的rxjs,您将无法再在返回的Observable上调用switchMap运算符。相反,您需要在可观察对象上调用管道,然后传递随后应该发生的情况。例如:
isValidUser()
.pipe(
switchMap(() => getCompany())
)
.subscribe(...do something...)
也可以将多个运算符传递到管道函数中。可以在操作员页面的rxjs网站上找到更多信息
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句