从具有Angular 2 http调用的函数返回Promise,该调用返回Observable

时间:2016-12-13 21:49:15

标签: javascript angular promise observable es6-promise

我的服务中有一个方法,它从存储中读取令牌并返回一个promise。

getToken() {
 return this.storage.get('access_token');
}

(storage.get返回一个承诺)

我需要修改上面的方法,以便它首先从存储中读取访问令牌并检查其到期时间,如果它未过期则立即返回,如果它已过期从存储读取refresh_token,即this.storage.get('refresh_token' )它再次返回一个promise,在检查它是否未过期后,我需要使用Angular 2 http.post向我的api发出http请求,这将返回一个新的访问令牌。一旦收到新的访问令牌,getToken函数就会返回。

我虽然下面会有效,但它不会:

getToken() {
        var promise = new Promise(function (resolve, reject) {
            this.storage.get('access_token').then((accessToken) => {
                //check if the token is expired
                if (accessToken) {
                    if (!this.isExpired(accessToken)) {
                        resolve(accessToken);
                    }
                    else {
                        this.storage.get('refresh_token').then((refreshToken) => {
                            if (!this.isExpired(refreshToken)) {
                                this.http.post('/api/refresh/', { token:refreshToken })
                                    .subscribe((data) => {
                                        resolve(data);
                                    });
                            }
                            else {
                                resolve(null);
                            }
                        });
                    }
                } else {
                    resolve(null);
                }
            });
        });

        return promise;
    }

任何人都可以指导,如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

我打赌你在回传functionhave the wrong this传递给new Promise构造函数。

您也可以在那里使用箭头功能,或者只需avoid the promise construction antipattern并完全删除它:

getToken() {
    return this.storage.get('access_token').then(accessToken => {
        if (!accessToken)
            return null;
        else if (!this.isExpired(accessToken))
            return accessToken;
        else
            return this.storage.get('refresh_token').then(refreshToken => {
                if (this.isExpired(refreshToken))
                     return null;
                else
                     return promiseFromObservable(this.http.post('/api/refresh/', { token:refreshToken }));
            });
    });
}

function promiseFromObservable(o) {
    return new Promise(resolve => o.subscribe(resolve));
}