角度(4):具有可观察对象的多个HTTP请求:一个接一个地成功

丹尼斯·M。

我对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';您也可以使用mergeMapflatMapmergeMap是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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Angular中一个接一个地同步调用可观察对象

可观察地一个接一个地跑

合并多个可观察对象并返回一个

如何在每个请求中一个接一个地存储多个对象?

是否有一个可用作concatMap的运算符,但具有多个内部可观察对象

如何基于从另一个可观察对象返回的键中的键创建可观察/ http请求的数组

一个可观察的多个可观察事件

多个httpclient请求,该请求依赖于使用可观察对象的另一个httpclient请求的数据

使用一个可观察对象同步另一个可观察对象

预订两个可观察对象,即在另一个可观察的HTTP内部观察

RxJ:一个接一个地执行3个可观察对象,并使用第一个,第二个以及第三个请求中的第一个和第二个请求的结果

如何在角度4中一个接一个地进行多个订阅?

角度多流一个可观察

如何有条件地订阅一个可观察的对象,等待响应并返回完整结果?

角度-如何将多个“ valueChanges”可观察值组合为一个

使用角度rxjs中的另一个可观察对象转换数据

如何一个接一个地请求多个权限?

如何执行多个异步请求,一个接一个地启动

创建一个可观察对象,该对象从另一个可观察对象发出数据子集

RxSwift对一个可观察的多个订阅

如何使一个复杂的对象成为可观察的

从可观察数组中获取一个对象

如何多次订阅一个可观察对象?

制作一个JFrame和可观察对象

如何返回一个空的可观察对象

角度6:将可观察的响应传递给另一个可观察的

用另一个可观察对象更改一个可观察对象的订阅状态

如何在另一个可观察对象内部解析一个可观察对象?-rxjs

Angular-如何从另一个可观察对象返回一个可观察对象