gpt4 book ai didi

Angular (4) : Multiple HTTP requests with Observables: one after another succeeds

转载 作者:行者123 更新时间:2023-12-03 19:37:41 25 4
gpt4 key购买 nike

我对 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 实现您想要的运算符(operator)。这是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'; .您也可以使用 mergeMapflatMap ( mergeMapflatMap 的同义词),但不是首选。

正如@BeetleJuice 在评论中提到的:为什么 switchMap更好?例如,您使用了 mergeMap 或 flatMap 并且某些东西导致了该代码的另一次调用。即使两个第一个请求没有完成,也会发送新的请求。甚至有可能第二个请求包比第一个请求完成得更快。在第一个捆绑包完成后,您的状态中有错误的数据。为了解决这个问题,RxJS 提供了完美的操作符 switchMap .如果您在上述情况下使用此运算符,则第一个 observable(第一个请求包)将被取消。只有最后一个可观察的(来自最后一次调用)会保持事件状态。仅当您有可能在短时间内多次运行该代码时,才需要 switchMap。如果您知道此代码只会运行一次 mergeMap/ flatMap会为你做同样的事情。

另外,请查看 this post .

2020 年 3 月 28 日更新:使用新版本的 rxjs,您不能再在返回的 Observable 上调用 switchMap 运算符。相反,您需要在 observable 上调用 pipe 并传入之后应该发生的事情。例如:
isValidUser()
.pipe(
switchMap(() => getCompany())
)
.subscribe(...do something...)

也可以将多个运算符传递到管道函数中。更多信息可以在 rxjs 站点上找到 operators page

关于 Angular (4) : Multiple HTTP requests with Observables: one after another succeeds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45920125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com