Angularjs Javascript方法总是返回false
在将用户保存到firebase users表之前,我试图检查用户,但是当我使用.once()firebase方法进行检查时,函数总是返回false 当我在函数中输入console.log时,它会正确地记录,但是它永远不会返回true Auth表示基本的Firebase验证工厂Angularjs Javascript方法总是返回false,angularjs,firebase,Angularjs,Firebase,在将用户保存到firebase users表之前,我试图检查用户,但是当我使用.once()firebase方法进行检查时,函数总是返回false 当我在函数中输入console.log时,它会正确地记录,但是它永远不会返回true Auth表示基本的Firebase验证工厂 var newUser = function(id) { ref.child('users').child(id).once('value', function(snapshot) { console.log(
var newUser = function(id) {
ref.child('users').child(id).once('value', function(snapshot) {
console.log(snapshot.val() === null);
return (snapshot.val() === null);
});
};
Auth.$onAuth(function(authData) {
console.log(Boolean(newUser(authData.uid)));
if (authData && !!(newUser(authData.uid))) { // add user if first time login
$scope.authData = authData;
ref.child('users').child(authData.uid).$save({
provider: authData.uid,
name: getName(authData),
blah: 'blah'
});
$state.go('main.home');
} else if (authData) {
$state.go('main.home');
} else {
console.log('Not Logged In');
}
});
您的新用户函数不会返回任何内容。也许它会帮助您查看是否将回调函数移出到它自己的命名函数中
var onValue = function(snapshot) {
console.log(snapshot.val() === null);
return (snapshot.val() === null);
};
var newUser = function(id) {
ref.child('users').child(id).once('value', onValue);
// new user doesn't return anything
};
当您省略返回值时,函数将自动返回未定义的
,您将其强制为布尔值-导致为false
这里的问题是Firebase的.once
方法的回调在函数返回值(失败)后运行。这是因为它是异步的
对于新的Javascript开发人员来说,这是一个相当常见的问题,但是可以通过一个小示例轻松地将其可视化
function doAsync() {
setTimeout(function() {
console.log('a');
return 'a';
}, 3000);
console.log('b');
return 'b';
}
doAsync();
您希望console.log
语句的运行顺序是什么?您希望函数返回哪个值?如果不明显,请花些时间在控制台中试验代码
显然,能够从异步函数中获取值仍然很重要。一种方法是使用回调函数
在本例中,您将向新用户函数添加一个回调参数,然后在新用户函数可用时立即调用该函数
var newUser = function(id, done) {
ref.child('users').child(id).once('value', function(snapshot) {
done(snapshot.val() === null);
});
};
然后修改其他代码以使用此样式
Auth.$onAuth(function(authData) {
newUser(authData.uid, function(val) {
// do something with the result
});
});
“Javascript方法总是返回false”不,它总是返回未定义的。谢谢,丹!我最终把它写进了一个承诺,并在承诺解决后检查了数据。非常好地解释了Javascript中发生的事情。