Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何返回回调函数?_Javascript_Angularjs_Http - Fatal编程技术网

Javascript 如何返回回调函数?

Javascript 如何返回回调函数?,javascript,angularjs,http,Javascript,Angularjs,Http,我使用Angular的$http来获取问题,希望得到一个承诺,或者成功或者错误: Question.getQuestions().success(function (res) { ... }).error(function (err) {}); 在我的方法中,我需要检查令牌是否过期,如果过期,请刷新,然后向/questions发出请求并返回承诺。否则,只需像往常一样向/questions发出请求: getQuestions: function() { // this is ca

我使用Angular的
$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?*/);
}