修复在执行http获取请求angularJS时的竞争条件
Fix race condition when doing http get request angularJS
我有下面的函数,它检查用户是否输入了正确的密码和用户名。此函数正常工作,但是函数在成功/错误函数被激发之前返回。
因此,函数总是返回true,让函数返回正确值的最佳方法是什么。
angular.module('services.security', [])
.provider('securityService', function() {
this.$get = function ($q, $location, $rootScope, $window, $injector) {
...
loginCheck: function(username, password) {
var failed = true;
$injector.get('$http').post(AUTH_URL,
{username: username, password: password}, {loginType: "cancel"}
).success(function loginSuccess(data) {
failed = false;
}).error(function loginFailure(data, status) {
failed = true;
});
return failed;
},
您可能希望返回promise。所以你可以直接返回你的http呼叫:
return $http("...");
在你的代码中,你可以使用这个返回的承诺来检查它是否成功:
loginCheck(u, p).then(function() {
//success
}, function() {
// error
});
您应该对JavaScript Promises进行一些研究。这就是你在这里的工作。问题是HTTP调用(通常)是异步的,这意味着代码不会等到它们完成后再继续。这就是承诺的来源。
函数不应该直接返回true/false值,而应该返回一个表示true/false的promise。然后,您可以将处理程序函数附加到它上,本质上说"只要HTTP调用完成,就将结果传递给这些函数。如果您使用的是Angular的最新版本,例如1.4.4+或1.5.x(不确定Angular 2,但可能仍然适用),$http.post()
方法无论如何都会返回promise,所以您可以直接返回。
关键是承诺的.then()
方法。这需要两个参数:第一个参数是成功函数,第二个参数是失败函数。所以你应该这样重写你的代码:
loginCheck: function(username, password) {
var failed = true;
return $injector.get('$http').post(AUTH_URL,
{username: username, password: password}, {loginType: "cancel"}
);
}
// ...
// somwhere else where securityService.loginCheck() is used
securityService.loginCheck(username, password).then(
// success
function(data) {
// handle successful login
},
// failure
function(data, status) {
// handle failed login
}
);
现在异步代码就是这样写的。阅读Promises和异步概念,这在现代网络开发中非常重要。
- 承诺简介
- 承诺A+标准
- MDN关于最近内置Promise类型的文档
$q
,Angular的承诺服务
相关文章:
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- AngularJS:我可以跳过函数参数回调吗
- AngularJS UI路由器不能像ng路由器那样工作
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 如何包含特定于每个视图angularjs的javascript文件
- AngularJS:ng之后,重复$scope值未按预期更新
- AngularJS-在JSON选择器中使用变量名
- $window.ga在AngularJS事件中未定义
- AngularJS-使用'true'属性
- 打开一个模态并将其链接到AngularJS中的指令
- Angularjs代码未在匿名函数中运行
- angularjs+rails应用程序中未显示模板
- 我的AngularJS表达式没有'不起作用
- AngularJS JSON not arriving php
- 使用AngularJS中的筛选器更新给定的表
- Angularjs工厂注入错误
- 修复在执行http获取请求angularJS时的竞争条件
- 使用独立的 AngularJS 控制器修复竞争条件
- AngularJS中$http的竞争条件
- AngularJS中存在竞争条件吗?