我用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是另一个依赖于promise的
$http
,然后调用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
调用。我怎样才能把承诺还给原来的承诺? 最佳答案
这里有一个建议,因为你的代码看起来太复杂了。
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
/.success()
被调用,则按通常的方式执行.then()
)您可以进一步简化这个过程,并让
GET
通过在refreshToken方法中移动Auth
行来为您处理所有的令牌刷新。另一个例子:
getQuestions: function() {
return Auth.refreshToken().then(function(){
return $http.get(url + ver + '/questions');
});
}
refreshToken: function() {
if (_this.tokenIsExpired())
return _this.getAuth(OAuth).then(function (access_obj) {
//set token
});
else return $q.resolve(/*value needed?*/);
}