Javascript 如何返回回调函数?
我使用Angular的Javascript 如何返回回调函数?,javascript,angularjs,http,Javascript,Angularjs,Http,我使用Angular的$http来获取问题,希望得到一个承诺,或者成功或者错误: Question.getQuestions().success(function (res) { ... }).error(function (err) {}); 在我的方法中,我需要检查令牌是否过期,如果过期,请刷新,然后向/questions发出请求并返回承诺。否则,只需像往常一样向/questions发出请求: getQuestions: function() { // this is ca
$http
来获取问题,希望得到一个承诺,或者成功
或者错误
:
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
,然后调用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',
...
});
},
所有这些方法都按预期调用,但我得到错误:
无法读取未定义的属性“success”
这是因为
Auth.refreshToken(get)
没有按其应该的方式返回/questions$http
调用。我如何才能将该问题的承诺返回到原始的问题.getQuestions()
?这是失败的,因为刷新authToken时,您只调用get,而不返回它返回的承诺
试试这个:
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();
})...
然后:
最可取的清理方法是使令牌检查返回一个承诺,一旦确认或刷新令牌,该承诺将自行解决,因此最终结果将是:
Auth.checkToken().then(function() { return get() });
这里有一个建议,因为你的代码看起来太复杂了
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应该刷新令牌并在完成时返回一个承诺。然后,当您获取
问题时,检查令牌是否过期,如果过期,则调用刷新令牌
,完成(.success()
/.Then()
被调用,您执行通常的获取
)
通过在refreshToken方法中移动行Auth.tokenIsExpired()
,您可以进一步简化此操作,并让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?*/);
}
那么什么是
\u this.getAuth
?@zerkms见上文edit您不应该使用then()而不是success(),为什么不返回_this.getAuth(…)并返回callback()success
和error
不是承诺方法……事实上,由于使用success和error不属于承诺链的一部分,因此不推荐使用这些方法。每个then()
返回到链中的下一个then()
,链中间抛出的任何错误都会在链的末尾被捕获。我尝试了这一点,给出了无法读取Question.getQuestions()的未定义的属性“then”)。然后…
我想知道是否将每个$http
请求包装到返回Auth.refreshToken()。然后(函数(){
,我是否应该使用$httpProvider。拦截器
在请求发出之前拦截请求,检查Auth是否需要刷新令牌,然后它将转到$http
请求?在我看来,这将是最好的方法。
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?*/);
}