Empêcher la demande d’ajax jusqu’à l’obtention d’un nouveau jeton

J’ai implémenté la fonctionnalité de jeton d’actualisation pour mon API Web, grâce à laquelle un utilisateur peut obtenir un nouveau jeton à l’aide d’un jeton d’actualisation.

Chaque fois que l’API renvoie un code d’état non autorisé, je dois obtenir un nouveau jeton et mettre à jour toutes les demandes en attente avec ce nouveau jeton. Mais au lieu de cela, une demande d’API d’envoi de demande ajax avec un ancien jeton en tant que nouveau jeton n’est pas encore obtenue et la demande d’un nouveau jeton est en cours.

Je veux un moyen d’empêcher cette demande jusqu’à ce que le nouveau jeton ne soit pas obtenu. De plus, j’ai utilisé une bibliothèque javascript tierce, je ne peux donc pas définir async sur false, car cela nuirait aux performances du système.

METTRE À JOUR:

Résolu le problème en ajoutant la logique ci-dessous. J’espère que cela peut aider les autres.

$.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);});