2016-05-10 3 views
-1

Как мне получить фабрику authCheck для запуска перед функцией «Проверить состояние входа пользователя»?

Я пытаюсь проверить состояние $rootScope на маршрутизации и HTTP запросов:

//Global Logout Function 
myApp.run(function($rootScope, $http) { 
    $rootScope.logout = function() { 
     $http.post('/api/auth/logout'); 
    }; 
}); 
//Check Login state of user 
myApp.run(function($rootScope, $http, $window) { 
    $rootScope.$on('$routeChangeStart', function() { 
     $http.get('/api/auth') 
     .then(function successCallback(response) { 
      $rootScope.logStatus = response.data.data.loggedIn; 
      console.log('initial ' + $rootScope.logStatus); 
     }, function errorCallback(response) { 
      $rootScope.logStatus = response.data.data.loggedIn; 
     }); 
    return $rootScope.logStatus; 
    }); 

}); 
//Check for authenticated users on http requests (API calls and Routing changes) and redirect to login if logged out 
myBirkman.factory('authCheck', ['$rootScope','$window', function($rootScope, $window) { 

var authCheck = { 
    'request': function(config) { 
     if ($rootScope.logStatus == true) { 
      //do nothing 
      console.log('redirect ' + $rootScope.logStatus); 
     } else if ($rootScope.logStatus == false) { 
      $window.location.href = '/login.php'; 
     } 
    }, 
    'response': function(response) { 
return response; 
    } 
}; 
return authCheck; 
}]); 




// Define routing within the app 
myApp.config(['$httpProvider', '$routeProvider', function($httpProvider, $routeProvider) { 
$httpProvider.interceptors.push('authCheck'); 

Я попытался преобразовать элемент $ rootScope постоянной, но та же проблема появляющаяся. Завод работает до функции запуска, поэтому константа не обновляется до тех пор, пока завод не запустится.

+0

Вы пытаетесь проверить статус, прежде чем auth вернет ответ? Если нет, console.log $ rootScope – brianlmerritt

+0

Да, console.log # 2 - это просто проверить, доступен ли rootScope (для устранения неполадок). Я оставил его, чтобы указать, где я вижу, что rootScope возвращается как неопределенный. –

+0

См. Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call, чтобы понять, как работает асинхронный запрос. – Thierry

ответ

0

Большое спасибо Адитье. Решение состояло в том, что мое форматирование функции перехватчика было неправильным. После переформатирования мой код работал как шарм. Одно замечание, не забудьте вернуть обратно конфигурацию в запросе и ответ в ответе, чтобы ваши запросы по-прежнему функционировали должным образом.

0

Вы не можете быть уверены в значении, которое будет присутствовать, если оно заполнено после того, как обещание будет разрешено. Вы не получите правильное значение $rootScope.logStatus, потому что его заполняется только после завершения вызова $http.get, что может произойти после того, как ваш заводский код завершил выполнение.

+0

Спасибо Адите, это имеет смысл. Как бы вы предложили мне подойти к этой конкретной проблеме? Мне пришлось отделить логику исходного HTTP-вызова от перехватчика, потому что он вызывал циклический логический цикл. –

+0

Вместо этого используйте 'http interceptors'. Обратите внимание: https://docs.angularjs.org/api/ng/service/$http, http://stackoverflow.com/a/28267784/3878940 –

+0

Я использую перехватчик. Посмотрите на последнюю строку выше. –