【问题标题】:Returning Promise from function having Angular 2 http call which returns an Observable从具有 Angular 2 http 调用的函数返回 Promise,该函数返回一个 Observable
【发布时间】:2017-04-29 02:33:47
【问题描述】:

我的服务中有一个方法可以从存储中读取令牌并返回一个承诺。

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

(storage.get 返回一个承诺)

我需要修改上述方法,使其首先从存储中读取访问令牌并检查其是否过期,如果未过期则立即返回,如果过期则从存储中读取 refresh_token 即 this.storage.get('refresh_token' ) 再次返回一个承诺,在检查它是否未过期后,我需要使用 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;
    }

谁能指导一下,如何做到这一点?

【问题讨论】:

  • 您遇到了错误,对吧?
  • 嘿,承诺+回调地狱。更好地使用 returnPromise.resolve(value)Promise.reject(value) 配对会简化事情,同时删除 var promise = new Promise(function (resolve, reject) {
  • 是的,它返回一个错误。
  • 你能指导一下吗?
  • 还有哪个错误?请留言。

标签: javascript angular promise observable es6-promise


【解决方案1】:

我在你的回调function 中向你打赌have 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));
}

【讨论】:

  • 非常感谢Bergi,这真的很有帮助并修复了错误。但现在还有一个问题。我需要将从 /api/refresh/ 收到的新令牌写入存储。在承诺返回之前。所以我更新了最后一个返回调用返回 this._gs.promiseFromObservable(this.sendPostRequest('/api/refresh/', { token: refreshToken }, options).subscribe((newToken) => { this.storage.set( 'access_token', newToken); }));但现在我收到错误“例外:o.subscribe 不是函数”,请您指导一下?
  • 好的解决了,我所做的是在 promiseFromObservable 方法中订阅并放入 this.storage.set('access_token', newToken);在里面。这是正确的方法吗?
  • 不,不要多次订阅。只需链接另一个 then 回调:return promiseFromObservable(this.sendPostRequest(…)).then(new_Token => { this.storage.set('access_token', newToken); return newToken; });
  • 完美运行!非常感谢Bergi,非常感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2020-10-04
  • 2021-07-26
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多