更新设置并在ajax失败时重试

时间:2018-08-14 12:03:24

标签: javascript jquery ajax

这是我当前的代码,该代码正在调用api并会执行某些操作

function callApiAjax(url,token){
    var settings = {
        "async": true,
        "crossDomain": true,
        "url": url,
        "method": "GET",
        "headers": {
            "token": token,
        }
    };
    var callAPI = $.ajax(settings);
    callAPI.done(function(){
        doSomethingWhenSuccess();
    });

    callAPI.fail(function(){
        doSomethingWhenFail();
    });

}

它可以工作,但有时令牌会过期。我还有另一个可以更新令牌的API。所以我想将另一个api添加到fail函数。 我可以那样做吗?

function callApiAjax(token,retry) {
    var settings = {
        "async": true,
        "crossDomain": true,
        "url": url,
        "method": "GET",
        "headers": {
            "token": token,
        }
    };
    var callAPI = $.ajax(settings);
    callAPI.done(function () {
        doSomethingWhenSuccess();
    });

    callAPI.fail(function () {
        if(retry){
            var updateTokenSetting = {
                "async": true,
                "crossDomain": true,
                "url": url,
                "method": "GET",
                "headers": {
                    "token": token,
                }
            };
            var updateToken = $.ajax(updateTokenSetting);
            updateToken.done(function (response) {
                //Set the original settings.headers.token to response.data.token;
                //Redo the "CallAPI" ajax Call Once

            });
            updateToken.fail(function () {
                doSomethingWhenFail();
            });
        }else{
            doSomethingWhenFail();
        }

    });

}

我不想复制故障功能中的设置,因为我认为这太复杂且难以阅读,但是我不知道如何仅更新令牌并重做ajax调用 only < / em>一次。

有什么办法解决我的问题吗?

2 个答案:

答案 0 :(得分:2)

您可以简单地执行以下操作:

updateToken.done(function(response){
    callApiAjax(response.data.token, false);
}

答案 1 :(得分:0)

不,您不能将令牌api调用为fail函数。但是您可以像这样重新组织代码语句。

function callApiAjax(token,retry) {
var settings = {
    "async": true,
    "crossDomain": true,
    "url": url,
    "method": "GET",
    "headers": {
        "token": token,
    }
};
var callAPI = $.ajax(settings);
callAPI.done(function () {
    doSomethingWhenSuccess();
});

callAPI.fail(function () {
    if(retry){
        var updateToken = $.ajax(settings);
        updateToken.done(function (response) {
            //Set the original settings.headers.token to response.data.token;
            //Redo the "CallAPI" ajax Call Once

        });
        updateToken.fail(function () {
            doSomethingWhenFail();
        });
    }else{
        doSomethingWhenFail();
    }

});

}