Angular 2可观察多个http请求单个令牌

时间:2016-11-24 14:46:37

标签: angular typescript angular2-services typescript2.0

在这个角度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;
}

1 个答案:

答案 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;
}