如何返回回调函数?

时间:2016-06-21 00:36:17

标签: javascript angularjs http

我使用Angular的$http来获取问题,这些问题需要回复,successerror

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()

2 个答案:

答案 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() });