Javascript 在获得新令牌之前阻止ajax请求

Javascript 在获得新令牌之前阻止ajax请求,javascript,jquery,ajax,Javascript,Jquery,Ajax,我已经为我的WEB API实现了刷新令牌功能,因此用户可以使用刷新令牌获取新令牌 每当API返回未经授权的状态代码时,我需要获取新的令牌,并使用该新令牌更新所有挂起的请求。但与此相反,一些ajax请求使用旧令牌发送API请求,因为新令牌尚未获得,并且新令牌的请求正在进行中 我想要一种方法来阻止此请求,直到无法获得新令牌。另外,我使用了第三方javascript库,所以我不能将async设置为false,因为这会损害系统的性能 更新: 通过添加以下逻辑解决了此问题。希望这能帮助别人 $.ajaxP

我已经为我的WEB API实现了刷新令牌功能,因此用户可以使用刷新令牌获取新令牌

每当API返回未经授权的状态代码时,我需要获取新的令牌,并使用该新令牌更新所有挂起的请求。但与此相反,一些ajax请求使用旧令牌发送API请求,因为新令牌尚未获得,并且新令牌的请求正在进行中

我想要一种方法来阻止此请求,直到无法获得新令牌。另外,我使用了第三方javascript库,所以我不能将async设置为false,因为这会损害系统的性能

更新:

通过添加以下逻辑解决了此问题。希望这能帮助别人

$.ajaxPrefilter(function (opts, originalOpts, jqXHR) {
// you could pass this option in on a "retry" so that it doesn't
// get all recursive on you.
if (opts.refreshRequest) {
    return;
}

// our own deferred object to handle done/fail callbacks
var dfd = $.Deferred();

// if the request works, return normally
jqXHR.done(dfd.resolve);

// if the request fails, do something else
// yet still resolve
jqXHR.fail(function () {
    var args = Array.prototype.slice.call(arguments);
    if (jqXHR.status === 401) {
        $.ajax({
            url: BASEPATH.APIPATH + '/Token',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
            },
            method: 'POST',
            refreshRequest: true,
            error: function () {
                // reject with the original 401 data and then redirect to login page.
                setTimeout(function () {
                    window.location = "/Login";
                }, 4000);
                dfd.rejectWith(jqXHR, args);
            },
            success: function (res) {
                // retry with a copied originalOpts with new access token.
                var newOpts = $.extend({}, originalOpts, { url: opts.url });

                // pass this one on to our deferred pass or fail.
                $.ajax(newOpts).then(dfd.resolve, dfd.reject);
            }
        });

    } else {
        dfd.rejectWith(jqXHR, args);
    }
})

return dfd.promise(jqXHR);});

在服务器生成新令牌之前,请在特定时间使用以下代码激活javascript

function wait(ms) {
    var start = new Date().getTime();
    var end = start;
    while (end < start + ms) {
        end = new Date().getTime();
    }
}
函数等待(毫秒){
var start=new Date().getTime();
var结束=开始;
同时(结束<开始+毫秒){
end=新日期().getTime();
}
}
等待(5000)//5秒


在等待函数中,您可以指定服务器生成令牌所用的时间。如果它对你有帮助,请投票

在服务器生成新令牌之前的特定时间内,让javascript使用以下代码

function wait(ms) {
    var start = new Date().getTime();
    var end = start;
    while (end < start + ms) {
        end = new Date().getTime();
    }
}
函数等待(毫秒){
var start=new Date().getTime();
var结束=开始;
同时(结束<开始+毫秒){
end=新日期().getTime();
}
}
等待(5000)//5秒


在等待函数中,您可以指定服务器生成令牌所用的时间。如果它对你有帮助,请投票

这是没有用的,因为所有请求都是异步发送到API的,我想在获取第一个请求回调且其授权失败时阻止它们。这是没有用的,因为所有请求都是异步发送到API的,我想在获取第一个请求回调且其授权失败时阻止它们。