2015-04-26 3 views
0

Im пытается поймать ошибки, возвращенные с моего сервера, и вернуть их в конце функции входа. Если это удастся, ошибки не будут возвращены, и если это не удастся, список ошибок будет возвращен. Код Логина является частью AngularJS службы, как показано ниже:Javascript/AngularJS Scope Issue

angular.module('auth').service('RestfulAuthService',['$http','REST_BASE_URL',function($http,base_url){ 
var self = this; 

//define backend urls 
var api_urls = { 
    login: base_url+'/login/', 
} 
//hold user credentials to be accessed 
var api_user = { 
    username:null, 
    email:null, 
    first_name:null, 
    last_name:null, 
} 
var api_user_token = null; 

self.user_profile = function(){ 
    return api_user; 
} 
self.login = function(username,password){ 
    var errors = {none:null}; 
    $http.post(api_urls.login,{username:username,password:password}) 
    .then(function(response){ //success 
     //extract data 
     api_user.username = response.data.username; 
     api_user.email = response.data.email; 
     api_user.first_name = response.data.first_name; 
     api_user.last_name = response.data.last_name; 
     api_user_token = response.data.token; 
     //Add auth token to headers for all future requests 
     $http.defaults.headers.common['Authorization'] = api_user_token; 
     errors = {}; 
    },function(response){ //error 
     errors = response.data; //return serializer errors 
    }); 
    return errors; 
}; 
//REST OF SERVICE ... 

возвращаемого значения, однако, всегда {ни: нулевая}. Другими словами, переменная ошибок не была изменена функциями успеха или сбоя. Я уверен, что это проблема, но я не знаю, как ее исправить.

+0

$ http.post - это асинхронная функция. Вы возвращаете свои ошибки до того, как закончится $ http.post. – k4l4m

+0

Ах, конечно! Благодарю. – MichaelJK

ответ

2

Это проблема определения области, но это скорее проблема синхронизации. Запрос HTTP начинается, и return errors; выполняется задолго до того, как достигнут код .then. Вы должны использовать обратный вызов для передачи данных об ошибках.

self.login = function(username,password,callback){ 
    var errors = {none:null}; 
    $http.post(api_urls.login,{username:username,password:password}) 
    .then(function(response){ //success 
     //extract data 
     api_user.username = response.data.username; 
     api_user.email = response.data.email; 
     api_user.first_name = response.data.first_name; 
     api_user.last_name = response.data.last_name; 
     api_user_token = response.data.token; 
     //Add auth token to headers for all future requests 
     $http.defaults.headers.common['Authorization'] = api_user_token; 
     errors = {}; 
     callback(errors); 
    },function(response){ //error 
     errors = response.data; //return serializer errors 
     callback(errors); 
    }); 
}; 

Вызывающий код должен вызывать с обратным вызовом и использовать его аргумент для доступа к ошибкам.

self.login(username, password, function(errors) { 
    // handle errors 
});