1

我正在从我的 firebase 获取数据

//user balance check
var balanceRef = new      Firebase('https://****.firebaseIO.com/arcade/grabbit/'+category+'/'+brand+'/'+gameId+'/'+'activePlayers'+'/'+userId+'/');

这是获取数据的函数

//check user balance
function checkBalance(){
balanceRef.on('value', function(snapshot) {
if(snapshot.val()=== null){
  mLeft=0
 } else{
 mLeft=snapshot.val().tokensLeft
        }
 return mLeft 
                             })
 }

当用户单击一个按钮时,我首先检查他们的余额

$('#grabbit').click(function() {

 //call checkBalance function on click
 var myTokensLeft=checkBalance();

 });

这里的问题是它将函数值返回为 NaN 或 undefined

我已经反复测试过,该函数确实返回了一个值。为什么它不能在点击时获取价值?我在结构上做错了什么吗?我对javascript很陌生

4

2 回答 2

4

balanceRef.on对我来说看起来像一个异步函数,这就是为什么你不会得到返回值。尝试这样的事情:

//check user balance
function checkBalance(callback){
  balanceRef.on('value', function(snapshot) {
    if(snapshot.val()=== null){
      mLeft=0
    } else{
      mLeft=snapshot.val().tokensLeft
    }
    callback(mLeft);
  })
}


$('#grabbit').click(function() {

  //call checkBalance function on click
  checkBalance(function(myTokensLeft){

  // do something with myTokensLeft

  });   

});

编辑:更多细节

该函数balanceRef.on不会返回您想要的数据,它只会将该函数附加function(snapshot)...到 objectbalanceRefvalue事件。当 objectbalanceRefvalue事件被触发(即数据可用)时,您的函数function(snapshot)...将被执行,但它的返回值无处可去,因为 javascript 解析器已经继续前进。

尝试这个:

function checkBalance(){
  balanceRef.on('value', function(snapshot){
    return 'foo';
  });  
  return 'bar';
}

$('#grabbit').click(function(){

  console.log(checkBalance());
  // this will print 'bar' in your
  // in your console, not 'foo'
});

编辑 2:为避免回调链接,可以使用两个函数共有的变量。(虽然不是一个很好的做法,因为您无法确定该值是否已在您需要时设置!)

(function(){
  // added the closure to avoid myTokensLeft cluttering 
  // into global variables

  var myTokensLeft;

  balanceRef.on('value', function(snapshot){
    var mLeft;
    if (snapshot.val()=== null){
      mLeft=0
    } else{
      mLeft=snapshot.val().tokensLeft
    }
    myTokensLeft = mLeft;
  });

  $('#grabbit').click(function(){

    // do something with myTokensLeft

  });

}());
于 2013-10-04T15:45:56.427 回答
1

在我看来,在您的点击事件中,您只为“价值”事件创建了另一个侦听器,并且上帝知道该事件是如何以及何时触发的,以及函数在何处返回您的 mLeft。

您的代码中发生的情况是,每次单击“#grabit”后,总是会创建新的侦听器,但不一定要调用里面的函数,如果调用它,它会被异步调用,这意味着在它完成时你已经“未定义”。

于 2013-10-04T16:10:04.890 回答