【发布时间】:2016-11-20 16:03:13
【问题描述】:
我在从控制器中的服务中获取价值时遇到问题。 我使用服务从 API 中获取价值:
angular.module('app').factory('service',
['$q', '$rootScope', '$timeout', '$http',
function ($q, $rootScope, $timeout, $http) {
// create user variable
var user = null;
// return available functions for use in the controllers
return ({
isLoggedIn: isLoggedIn,
getUserStatus: getUserStatus,
login: login,
getEmail: getEmail
});
function isLoggedIn() {
if(user) {
return true;
} else {
return false;
}
}
function getUserStatus() {
return $http.get('/user/status')
// handle success
.success(function (data) {
if(data.status){
user = true;
} else {
user = false;
}
})
// handle error
.error(function (data) {
user = false;
});
}
function login(username, password) {
// create a new instance of deferred
var deferred = $q.defer();
// send a post request to the server
$http.post('/user/login',
{username: username, password: password})
// handle success
.success(function (data, status) {
if(status === 200 && data.status){
user = true;
deferred.resolve();
} else {
user = false;
deferred.reject();
}
})
// handle error
.error(function (data) {
user = false;
deferred.reject();
});
// return promise object
return deferred.promise;
}
function getEmail() {
// create a new instance of deferred
var deferred = $q.defer();
$http.get('/email/'+$rootScope.username)
.success(function (data) {
console.log(data);
deferred.resolve();
})
.error(function (data) {
deferred.reject();
})
return deferred.promise;
}
}]);
我正在尝试在控制器中获取和使用价值:
angular.module('app')
.controller('myController', ['$rootScope', '$scope', '$state', '$http', '$q', 'service', function ($rootScope, $scope, $state, $http, $q, service) {
$scope.email;
$scope.getEmail = function() {
// call getEmailFromDB from service
service.getEmail()
// handle success
.then(function (data) {
$scope.email = data; //here I got undefined
console.log($scope.email);
})
// handle error
.catch(function () {
$scope.error = true;
$scope.errorMessage = "wrong@mail.com";
});
};
$scope.getEmail();
}]);
但在控制器中有undefined 值。
关于$q的文档,我在服务和控制器中使用then()函数。
有人知道问题出在哪里吗?
【问题讨论】:
-
请阅读blog.ninja-squad.com/2015/05/28/angularjs-promises,因为您使用的是不推荐使用(并在 1.6 中删除)的 success() 和 error(),并且您使用的是反模式,而不是使用链接。
-
您不需要将 $http 调用包装在 promise 中。默认情况下,AngularJS 会为你创建 Promise。
标签: angularjs asynchronous q