【发布时间】:2013-05-07 16:36:20
【问题描述】:
一直在玩 firebase 和 angularjs,只是想把一些小东西放在一起。我现在在控制器中使用此功能在登录按钮单击时进行身份验证:
$scope.signin = function(){
var user1 = $scope.cred.user;
var pass1 = $scope.cred.password;
var ref = new Firebase("https://kingpinapp.firebaseio.com");
var auth = new FirebaseAuthClient(ref, function(error, user) {
if (user) {
// user authenticated with Firebase
console.log(user);
} else if (error) {
// an error occurred authenticating the user
console.log(error);
} else {
// user is logged out
}
});
auth.login('password', {
email: user1,
password: pass1,
rememberMe: false
});
console.log("tracer");
}
现在这很棒并且工作正常。但它似乎以异步方式工作,例如我的 console.log("tracer") 在 auth.login 的用户对象之前返回。我知道我可能需要使用 Promise 来完成这项工作并尝试执行以下操作:
var defer = $q.defer();
defer.auth
.then(function() {
auth.login('password', {
email: user1,
password: pass1,
rememberMe: false
});
})
.then(function() {
console.log("tracer");
})
但我收到 $q 在控制器模块中声明后未定义。所以我想做的是
- 检查用户是否登录。
- 等到我收到是/否
- 如果未登录,请使用 auth.login
- 其他用户用户登录做一些其他事情
我曾想过将 auth.login 函数放在变量 auth 的 else 中,但这似乎行不通。只是试图找出正确的逻辑来理解如何让它发挥作用。
【问题讨论】:
-
new Firebase("kingpinapp.firebaseio.com") 自动返回一个承诺,当您从服务器接收数据时该承诺已解决,因此无需手动使用 $q
-
好吧,假设我们运行 FirebaseAuthClient 来检查用户是否登录。如果没有登录,我想运行 auth.login 函数。我应该把 auth.login 放在我的 else 语句中吗?我尝试在控制台中遇到错误。
-
@asiammyself FirebaseAuthClient() 不检查用户是否登录!它只设置一个在用户的身份验证状态更改时运行的回调(请参阅:firebase.com/docs/security/simple-login-overview.html)。换句话说,在您致电
auth.login()之前,什么都不会发生。您的代码看起来是正确的,您只需将“用户登录后做一些其他事情”代码放在if (user) { ... }块中即可。 -
@asianmyself 顺便说一句, $q 不起作用的原因可能是因为您忘记将它注入控制器中。据我所知,Ajay 所说的并不是真的,但他说得对,如果你不想使用 $q,他是对的。
-
因此,如果在用户身份验证发生更改时运行 FirebaseAuthClient。如果有多个控制器,而不是在每个控制器中放置一个控制器,正确的做法是将 FirebaseAuthClient 放在工厂中吗?