我有以下功能,用于检查用户是否输入了正确的密码和用户名。这正常运行,但函数在触发成功/错误函数之前返回。
因此函数总是返回true,这是使函数返回正确值的最佳方法。
SELECT matchinfo(myftstable) FROM myftstable WHERE ...
答案 0 :(得分:4)
你想要回复承诺。 所以你可以回复你的http电话:
return $http("...");
在您的代码中,您可以使用此返回的承诺来检查它是否是succssful:
loginCheck(u, p).then(function() {
//success
}, function() {
// error
});
答案 1 :(得分:0)
你应该对JavaScript Promises做一些研究。这就是你在这里工作的内容。问题是HTTP调用(通常)是异步的,这意味着代码在继续之前不会等待它们完成。这是承诺的来源。
而不是直接返回true / false值,而是应该返回一个表示true / false值的promise。然后,您可以将处理程序函数附加到它基本上说"每当HTTP调用完成时,将结果传递给这些函数。如果您使用的是更新版本的Angular,例如1.4.4+或1.5.x(不确定Angular 2,但可能仍然适用),$http.post()
方法无论如何返回一个promise,因此你可以直接返回它。
关键是承诺的.then()
方法。这需要2个参数:第一个参数是成功函数,第二个参数是失败函数。所以你应该像这样重写你的代码:
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和异步概念,它在现代Web开发中非常重要。