Pourquoi la promesse ne fonctionne pas comme prévu dans AngularJS
-
21-12-2019 - |
Question
Dans mon application AngularJS, à chaque demande de changement de page que je lance :
$rootScope.$on('$locationChangeStart', function (event, next, current) {
var user;
$http.get('/api/Authentication/UserAuthenticated').then(function (data) {
console.log("call");
user = data.data;
});
console.log("end of call");
});
Lorsque j'exécute l'application et teste ce qui se passe, je vois dans la console que la "fin d'appel" est renvoyée avant console.log("call");
ce qui signifie que l'utilisateur n'est pas défini.Ce qui signifie que si je veux vérifier si l'utilisateur est connecté lors du changement d'itinéraire, l'utilisateur ne sera pas défini.
Comment puis-je effectuer une requête Angular run -> http et ensuite seulement continuer ?
La solution
J'ai un peu mal compris la question.Vous pouvez laisser le $routeProvider résoudre le $http
promesse:
var app = angular.module("myApp");
app.config(["$routeProvider", function($routeProvider) {
$routeProvider.when("/",{
templateUrl: "myTemplate.html",
controller: "MyCtrl",
resolve: {
user: ["$http", "$q", function($http, $q) {
var deferred = $q.defer();
$http.get('/api/Authentication/UserAuthenticated').success(function(data){
deferred.resolve(data.data);
}).error(function(error) {
deferred.resolve(false);
});
return deferred.promise;
}]
}
});
}]);
Si le code permettant de récupérer les données utilisateur est trop complexe, vous pouvez créer un service pour celui-ci et injecter ce service dans le $routeProvider
c'est resolve
fonction.
Dans votre contrôleur, vous injectez simplement la promesse (qui sera résolue) :
app.controller("MyCtrl",["$scope","user", function($scope, user) {
if (!user) {
alert("User not found");
}
...
}]);
Autres conseils
utiliser async:false
.Ça marche pour moi
Essayez ce code, au lieu de votre code
$rootScope.$on('$locationChangeStart', function (event, next, current) {
$http({method: 'GET',
url: '/api/Authentication/UserAuthenticated',
async: false
}).success(function (data) {
console.log("call");
user = data.data;
}
console.log("end of call");
});