使用Observables处理多个ajax http请求

时间:2016-12-02 20:26:20

标签: ajax angular typescript rxjs

我有angular2网站,它在启动时使用Json Web Tokens发送多个ajax请求进行授权

他们是:

public getUser(): Observable<User> {
    let headers = new Headers({
        'Authorization': 'Bearer ' + this.authService.token.access_token,
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    });
    let options = new RequestOptions({ headers: headers });
    return this.http.get('http://localhost:5000/api/users/profile', options)
        .map(response => response.json() as User).catch(this.handleError);
}


public getFriends(): Observable<User[]> {
    let headers = new Headers({
        'Authorization': 'Bearer ' + this.authService.token.access_token,
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    });
    let options = new RequestOptions({ headers: headers });
    return this.http.get(`http://localhost:5000/api/users/${this.authService.userId}/friends`, options)
        .map(response => response.json() as User[]).catch(this.handleError);
}

等等

但我需要访问令牌才能执行此请求 我存储它并在本地存储中刷新令牌,但访问令牌在5分钟后到期

因此,当用户登录访问和刷新令牌存储在本地存储

如果用户在登录后关闭浏览器,等待5分钟或更长时间再打开页面我们需要刷新它(使用其他请求)然后发送我们的请求

以下是主要问题:我们不知道会发送多少或哪些请求,因此我们无法对其进行硬编码

这是更新请求

 public update(): Observable<boolean> {
        let headers = new Headers({
            'Accept': 'application/json',
            'Content-Type': 'application/x-www-form-urlencoded'
        });


        let options = new RequestOptions({ headers: headers });
        return  this.http.post('http://localhost:5000/api/auth/token', "refresh_token=" + encodeURIComponent(this.token.refresh_token) + "&grant_type=refresh_token", options)
            .map((response: Response) => {

                let token = response.json();
                if (token) {
                    this.token = token;
                    localStorage.setItem('currentUser', JSON.stringify({
                        token: this.token,
                        userId: this.userId
                    }));
                    return true;
                }
                else {
                    return false;
                }
            }).catch(this.handleError);  

}

如果做这样的事情:

this.authService.update().flatMap(this.getUser);

它不会有帮助,因为我们会发送很多&#34;更新&#34;请求,这不会给我们带来任何好处

仅发送&#34;更新&#34;请求无法帮助,因为我们会发送一个&#34;更新&#34;以及许多其他要求

那么这个问题的解决方案是什么?

0 个答案:

没有答案