我使用Angular的$http
来获取问题,这些问题需要回复,success
或error
:
Question.getQuestions().success(function (res) {
...
}).error(function (err) {});
在我的方法中,我需要检查令牌是否已过期,如果是,刷新,然后向/questions
发出请求并返回承诺。否则,只需像往常一样向/questions
发出请求:
getQuestions: function() {
// this is called by refreshToken but not returning the $http promise
var get = function() {
return $http({
method: 'GET',
url: url + ver + '/questions',
...
});
};
if (Auth.tokenIsExpired()) {
return Auth.refreshToken(get);
} else {
return get();
}
},
refreshToken是另一个$http
,它依赖于一个promise,然后调用get()
回调。
Auth {...
refreshToken: function(callback) {
...
_this.getAuth(OAuth).success(function (access_obj) {
//set token
callback();
})...
其中getAuth是另一个$http promise
:
getAuth: function(params) {
return $http({
method: 'POST',
url: url + '/oauth/access_token',
...
});
},
所有这些方法都按预期调用,但收到错误:
Cannot read property 'success' of undefined
这是因为Auth.refreshToken(get)
没有按原样返回/questions $http
来电。如何将承诺从此回复到原来的Question.getQuestions()
?
答案 0 :(得分:2)
这是一个建议,因为您的代码看起来过于复杂。
getQuestions: function() {
var get = $http({
method: 'GET',
url: url + ver + '/questions',
...
});
if (Auth.tokenIsExpired()) {
return Auth.refreshToken().then(function(){
return get();
});
} else {
return get();
}
}
refreshToken: function() {
return _this.getAuth(OAuth).then(function (access_obj) {
//set token
});
}
基本上,refreshToken应刷新令牌并返回完成时的承诺。然后,当您GET
检查令牌是否已过期的问题时,如果有,则调用refreshToken
,当调用完{(1}} / .success()
后,您就会执行通常.then()
)
您可以进一步简化此操作,让GET
通过在refreshToken方法中移动行Auth
来处理所有令牌刷新。
另一个例子:
Auth.tokenIsExpired()
答案 1 :(得分:0)
这是失败的,因为当您刷新authToken时,您只需调用get但不返回它返回的promise。
试试这个:
refreshToken: function(callback) {
...
_this.getAuth(OAuth).success(function (access_obj) {
//set token
return callback();
})...
但我不会混合回调和承诺,而是会:
refreshToken: function(callback) {
var promise = $q.defer();
_this.getAuth(OAuth).success(function (access_obj) {
//set token
promise.resolve();
})...
然后:
if (Auth.tokenIsExpired()) {
Auth.refreshToken().then(function() { return get() });
} else {
return get();
}
最好清理它是为了让令牌检查返回一个承诺本身,一旦它确认或刷新令牌就解析,所以最终只会是:
Auth.checkToken().then(function() { return get() });