在这个角度2应用程序中,可以同时触发多个HTTP请求。这些是从同一组件的实例触发的,但是一次可以在页面上显示许多这些组件。
服务器在发出数据之前需要检索令牌。现在,每当例如同时触发6个请求时,对每个请求执行检查以查看令牌是否有效。如果它无效,则它们不等待第一个请求的响应,并将该令牌用于其他请求。
我正在使用mergeMap来确保在检索到令牌后执行数据请求,这使得应用程序正常运行。但是我希望它不会在同时触发请求时检索多个令牌。
我一直在尝试很多东西,但我似乎无法找到适用于我的场景的解决方案。我很感激你能给予的任何帮助。 看看我在下面尝试的一些代码。
获取
Get = (path: string): any => {
if (this.authentication.isAuthenticated()) {
this.SetAuthorizationHeader(this.authentication.token);
return this.GetRequest(path);
} else {
return this.authentication.getToken()
.mergeMap(prop => {
this.authentication.setToken(prop);
this.SetAuthorizationHeader(this.authentication.token);
return this.GetRequest(path);
});
}
}
为gettoken
getToken(): Observable<Response> {
if (!this.requestInProgress) {
this.requestInProgress = true;
let urlSearchParams = new URLSearchParams();
urlSearchParams.append('client_id', Constants.CLIENT_ID);
urlSearchParams.append('grant_type', Constants.GRANT_TYPE);
let body = urlSearchParams.toString()
this.pendingRequest = this.http.post(`${this.configuration.BaseUrl}`, body, { headers: this.configuration.Headers })
.map(this.extractData)
}
return this.pendingRequest;
}
答案 0 :(得分:0)
使用https://stackoverflow.com/a/36296015/5219786
中的建议进行修正<强>为gettoken 强>
getToken(): Observable<Response> {
if (!this.requestInProgress) {
this.requestInProgress = true;
let urlSearchParams = new URLSearchParams();
urlSearchParams.append('client_id', Constants.CLIENT_ID);
urlSearchParams.append('grant_type', Constants.GRANT_TYPE);
let body = urlSearchParams.toString()
this.pendingRequest =
this.http.post(`${this.configuration.BaseUrl}`, body, { headers: this.configuration.Headers })
.map(this.extractData)
.publishLast()
.refCount();
}
return this.pendingRequest;
}