0

Bonjour J'essaye d'effectuer un appel asynchrone dans la méthode de réponse d'un intercepteur http dans AngularJS. L'appel async est congédié mais reste bloqué dans une boucle infinie et l'appel async est appelé encore et ... Je ne sais pas pourquoi, je suppose que l'erreur a à voir avec la structure de mon async appelInterception HTTP angulaire JS boucle asynchrone infinie

var app = angular.module('AceAngularApi', []); 

app.service ('Ace', [ '$ http', '$ q', 'injecteur $', '$ fenêtre', la fonction (http $, $ q, injecteur $, fenêtre $) {

this.user = null; 

var setToken = function(token){ 
    $window.localStorage.token = token; 
}; 

var removeToken = function(){ 
    $window.localStorage.token = ''; 
} 

var setCurrentUser = function(currentUser){ 
    user = currentUser; 
}; 

var getCurrentUser = function(){ 
    var self = this; 
    var url = "http://localhost:8080/api/currentuser"; 

    var response = $http.post(url, {}).then(function(response){ 
     if(response.data.data["obj"]){ 
      self.user = response.data.data["obj"]; 
     } 

     return response; 
    }); 

    return response; 
}; 

var currentUser = function(){ 
    return user; 
}; 

return { 
    setToken: setToken, 
    setCurrentUser: setCurrentUser, 
    getCurrentUser: getCurrentUser, 
    currentUser: this.user, 
    removeToken: removeToken 
    } 

    }]); 


app.factory('authInterceptor',['$rootScope', '$q', '$window', '$injector', 
function ($rootScope, $q, $window, $injector) { 
return { 
request: function (config) { 
    config.headers = config.headers || {}; 
    if ($window.localStorage.token) { 
    config.headers.Authorization = 'Bearer ' + $window.localStorage.token; 
    } 
    return config; 
}, 
response: function(response) { 
    var deferred = $q.defer(); 

    var Ace = $injector.get('Ace'); 
    Ace.getCurrentUser().then(function(){ 
     deferred.resolve(response); 
    }); 

    return deferred.promise;  
    } 
    }; 
    }]); 

app.config(function ($httpProvider) { 
$httpProvider.interceptors.push('authInterceptor'); 
}); 

Répondre

0

Vous devez ajouter une vérification dans votre service Ace pour que getCurrentUser ne fasse qu'un seul appel asynchrone, quel que soit le nombre de fois qu'il est appelé

var callStatus = false; 
var getCurrentUser = function() { 
    var self = this; 
    var url = "http://localhost:8080/api/currentuser"; 

    if(!callStatus) { 
     callStatus = $http.post(url, {}).then(function(response){ 

     if(response.data.data["obj"]){ 
      self.user = response.data.data["obj"]; 
     }}); 
    } 

    return callStatus; 
};