【问题标题】:How to wait for the same observable to finish if called twice in angular?如果以角度调用两次,如何等待相同的 observable 完成?
【发布时间】:2018-12-23 04:59:46
【问题描述】:

我的问题与如何“如何等待 observable 完成”不同。我已经通过使用 switchMap 在我的代码中解决了这个问题。目前我有一个 api get 调用,在执行 httpget 之前,它会检查 refreshToken 是否已过期,在这种情况下,它将生成一个新令牌并等待它然后执行 httpget,这很棒。

我的问题是,如果我有以下情况:

this.getUsers();
this.getLocations();

让我们以令牌需要刷新的情况为例(我们需要等待刷新): 首先我们调用 this.getUsers() 这将触发创建一个新的令牌,并且在创建令牌后获取用户。 同时,我们还调用 this.getLocations() ,它也将触发创建一个新令牌,并且不会等待第一个 get 完成。我需要找到一种方法,让第二个 get 等待第一个 get 完成,以便两者都使用相同的新令牌。

【问题讨论】:

  • 你的意思是在执行第二个请求之前等待第一个请求完成?
  • 它们是独立的请求,但是如果第一个等待令牌完成,第二个获取也应该等待它而不是要求新的令牌
  • 我认为您要做的是在触发两个请求之前先检查您的令牌是否过期。如果您的令牌已过期,您要避免请求的一件事是存储您的令牌过期时间和日期。

标签: angular rxjs


【解决方案1】:

你在这个场景中使用的rxjs操作符是forkJoin()

Observable.forkJoin(
    this.http.get('/app/getUser').map((res: Response) => res.json()),
    this.http.get('/app/getLocation').map((res: Response) => res.json())
).subscribe(
  data => {
    this.users = data[0]
    this.locations = data[1]
  },
  err => console.error(err)
);

请参阅此示例:Example of stackoverflow

另请参阅以利用 Angular 中的 Observable:Take Advantage of Observable

【讨论】:

  • 从 Angular 6 开始只有 forkJoin(.....) 而不是 Observable.forkJoin(....)
【解决方案2】:

这些答案都没有帮助解决我的问题。在做了更多的研究之后,我能够使用 rxjs share() 实现我想要的,它允许多个调用者共享相同的 observable,因此令牌只刷新一次。

getUsers(); 将请求刷新令牌,然后执行 httpget。 getLocation(); 将检测到请求刷新令牌,因此将共享相同的 observable 而不会请求新令牌。

【讨论】:

    【解决方案3】:

    并行发送两个请求并等待两者都完成(代码来自头部):

    let [users, locations] = await Promise.all([
      this.getUsers().toPromise(),
      this.getLocations().toPromise()
    ]);
    // `users` and `locations` are ready to use here
    

    但是,如果您想发送第一个请求并在完成后发送第二个请求,然后使用:

    let users = await this.getUsers().toPromise(),
    let locations= await this.getLocations().toPromise();
    

    我假设你的函数 this.getUsers()this.getLocations() 返回 angular http.get(...) observable(记得将 async 关键字放在使用上述代码的函数名称附近)。更多关于 Promise 的信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2020-06-10
      相关资源
      最近更新 更多