我的问题与如何“如何等待可观察的物体完成”不同。我已经通过使用switchMap在代码中解决了这个问题。目前,我有一个api get调用,在执行httpget之前,它将检查refreshToken是否已过期,在这种情况下,它将生成一个新令牌并等待它,然后执行httpget,这很棒。
我的问题是,如果我有以下症状:
this.getUsers();
this.getLocations();
让我们以令牌需要刷新的情况为例(我们需要等待刷新): 首先我们调用this.getUsers(),它将触发创建一个新令牌,并且get用户将在创建令牌后发生。 同时,我们还调用this.getLocations(),该触发器还将触发创建新令牌,并且不会等待第一个完成。我需要找到一种方法,使第二个get等待第一个get完成,以便两个都使用相同的新令牌。
答案 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(); 将检测到请求刷新令牌,因此将共享相同的可观察对象,而不请求新令牌。