В настоящее время я изучаю, как использовать Angular.js, и пытался написать собственный код аутентификации с использованием REST-подобного API. Ниже приведен код моей службы аутентификации.
Проблема с моей функцией signIn
том, что она всегда возвращает false, даже когда мой api возвращает HTTP 200
. Через некоторое время я понял, что это связано с синхронным характером javascript, который return response;
оператор выполняется перед response = res.data.key;
выражение.
Я не знаю, как выполнить оператор return после завершения назначения (если ответ HTTP 200
). Как мне это сделать?
angular.module('app').factory('auth', ['Base64', '$http', function(Base64, $http) {
return {
signIn: function(email, password) {
var response = false;
var encoded = Base64.encode(email + ':' + password);
$http.defaults.headers.common.Authorization = 'Basic ' + encoded;
$http.post('api/v1/sign_in', {}).then(function(res) {
if (res.status == 200) {
response = res.data.key;
}
});
return response;
}
}
}]);
Используйте $q.defer()
:
angular.module('app').factory('auth', ['Base64', '$http', '$q', function(Base64, $http, '$q') {
return {
signIn: function(email, password) {
var response = false;
// You create a deferred object
// that will return a promise
// when you get the response, you either :
// - resolve the promise with result
// - reject the promise with an error
var def = $q.defer();
var encoded = Base64.encode(email + ':' + password);
$http.defaults.headers.common.Authorization = 'Basic ' + encoded;
$http.post('api/v1/sign_in', {}).then(function(res) {
if (res.status == 200) {
response = res.data.key;
// success: we resolve the promise
def.resolve(response);
} else {
// failure: we reject the promise
def.reject(res.status);
}
});
// You return the promise object that will wait
// until the promise is resolved
return def.promise;
}
}
}]);
Теперь вы можете сделать:
auth.signIn().then(function(key) {
// signin successful
// do something with key
}).catch(function(err) {
// signin failed :(
// do something with err
}).finally(function() {
// you could do something in case of failure and success
})
Вам нужно узнать о обещаниях: верните обещание из сообщения http.