Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Javascript方法总是返回false_Angularjs_Firebase - Fatal编程技术网

Angularjs Javascript方法总是返回false

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(

在将用户保存到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(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中发生的事情。