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

10-04 18:51