Service.js
this.userLogin = function (username, password) {
var dataBody = $.param({'username': username,'password': password});
return $http({
method: 'POST',
url: servicePathURL,
data: dataBody,
headers: {
"Authorization": "Basic",
"Content-Type": "application/x-www-form-urlencoded"
}
})
.then(function (response) {
$rootScope.globals = {
currentUser: {
username: username,
}
};
return response;
}).catch(function (error) {
throw error;
});
};
Controller.js
AuthenticationServiceLogin.userLogin($scope.username, $scope.password)
.then(function (response) {
if (response.status ==200) {
toaster.pop('success', "", "Login Successful");
$location.path('/home');
}
}).catch(function (error) {
toaster.pop('error', "", error.statusText);
});
toaster.pop('error', "", error.statusText);
。$http
方法,返回有什么好处
$q.defer()
承诺而不是$http
承诺或被视为最佳做法?如果是,我如何将上述$http
代码修改为promise
?答案 0 :(得分:0)
您的代码似乎没问题。只要您重新抛出$http
调用遇到的任何错误,他们应该一直传播到控制器。我倾向于说你的错误处理的任何问题都不在你发布的代码中。
如果你不打算对抛出的错误做任何工作,那么在service.js中有一个catch处理程序是没有优势的。 Service.js看起来像这样:
<强> Service.js 强>
this.userLogin = function (username, password) {
return $http({
method: 'POST',
url: servicePathURL,
data: $.param({'username': username,'password': password}),
headers: {
"Authorization": "Basic",
"Content-Type": "application/x-www-form-urlencoded"
}
})
.then(function (response) {
$rootScope.globals = {
currentUser: {
username: username,
}
};
return response;
// The catch block here is useless. The promise returned by $http will transmit any
// errors on its own.
//}).catch(function (error) {
// throw error;
});
};
回答你的第二个问题:使用$q.defer()
而不是返回$http
本身返回的承诺没有任何好处,还有一些主要的缺点 - 即登录引发的任何异常方法会消失。有关详细信息,请参阅此处的延迟反模式:https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns
$http
绝对是首选。