我试图通过编写登录功能继续理解承诺。 Login函数是AuthService的一部分,它向我的服务器发送一个http请求并返回一个promise(如果用户被验证则解析,如果没有,则解析,否则拒绝)。
当我在我的控制器中调用该函数时,我尝试使用.success和.error,因为该函数返回一个promise但是我得到错误" Undefined不是函数"。
这是我的函数,它获取了未定义的错误。
$scope.login = function(email, password) {
return AuthService.login(email, password).success(function(data) {
return console.log("login function returned", data);
}).error((function(data) {
return console.log("There was an error " + data);
}));
};
这是我的服务
.service('AuthService', function($window, $rootScope, $q, $http) {
return {
login: function(email, password) {
var deferred;
deferred = $q.defer();
$http.post('/dashboard/login', {
email: email,
password: password
}).error(function(error, status) {
console.log("Incorrect logi");
return deferred.reject(error);
}).success(function(data, status) {
$window.sessionStorage["userInfo"] = JSON.stringify(data);
return deferred.resolve(data);
});
return deferred.promise;
}
};
});
让我最困惑的是,在研究之后,似乎承诺没有成功或错误的方法,但$ http是一种承诺,有这种方法。如果他们没有成功和错误,你怎么知道某件事是否是错误?最后,如果没有成功或错误方法,那么.reject和.resolve是什么意思?
答案 0 :(得分:4)
让我最困惑的是,在研究之后,似乎承诺没有成功或错误的方法,但$ http是一个有这种方法的承诺
是的,的确如此。 $http
返回对象是还因遗留原因而拥有这些.success
和.error
方法的承诺。
如果他们没有成功和错误你怎么知道某件事是否是错误?
将处理程序附加到promise的标准方法是使用.then()
method,它也充当链接方法并返回处理程序结果的新承诺。
所以代码看起来像这样(也是avoiding the deferred antipattern):
.service('AuthService', function($window, $rootScope, $q, $http) {
return {
login: function(email, password) {
return $http.post('/dashboard/login', {
email: email,
password: password
}).then(function(data, status) {
$window.sessionStorage["userInfo"] = JSON.stringify(data);
return data;
}, function(error, status) {
console.log("Incorrect login");
throw error;
});
}
};
});
$scope.login = function(email, password) {
return AuthService.login(email, password).then(function(data) {
return console.log("login function returned", data);
}, function(err) {
return console.log("There was an error " + err);
});
};