如果以角度调用两次,如何等待相同的可观测对象完成?

时间:2018-12-20 05:54:59

标签: angular rxjs

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

我的问题是,如果我有以下症状:

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

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

3 个答案:

答案 0 :(得分:8)

在这种情况下供您使用的

rxjs运算符是[{"BatchID":"31-a1eac15c","BatchType":"Conversion","CreatedDate":"2018-12-19T11:51:18.577","IsBatchCompleted":false}, {"BatchID":"31-b3e8cc7e",BatchType":"","CreatedDate":"2018-12-19T10:18:51.27","IsBatchCompleted":false"}]

forkJoin()

请参见以下示例:Example of stackoverflow

还可以看到它可以利用Angular中的Observable:Take Advantage of Observable

答案 1 :(得分:0)

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

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()返回可观察到的角度http.get(...)(请记住,将async关键字放在使用上述代码的函数名称附近)。有关诺言here的更多信息。

答案 2 :(得分:0)

这些答案都无法解决我的问题。经过更多的研究,我能够使用rxjs share()实现我想要的功能,它允许多个调用者共享相同的可观察对象,因此令牌仅刷新一次。

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