AngularJS - 烤面包机无法在 Controller 中工作
AngularJS - Toaster not working in Controller
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);
});
- 在Controller.js中,当用户登录出现异常时,
toaster.pop('error', "", error.statusText);
不会被调用。
- 我也用过
$http
方法,返回有什么好处吗
$q.defer()
承诺而不是 $http
承诺或被视为最佳实践?如果是,我如何将上面的 $http
代码修改为 promise
?
您的代码似乎没问题。只要您重新抛出 $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
绝对是首选。
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);
});
- 在Controller.js中,当用户登录出现异常时,
toaster.pop('error', "", error.statusText);
不会被调用。 - 我也用过
$http
方法,返回有什么好处吗$q.defer()
承诺而不是$http
承诺或被视为最佳实践?如果是,我如何将上面的$http
代码修改为promise
?
您的代码似乎没问题。只要您重新抛出 $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
绝对是首选。