适当的javascript函数结构

时间:2013-10-04 15:39:33

标签: javascript

我从我的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或未定义

我已经重复测试过,该函数确实返回了一个值。为什么不能点击点击值?我是否对结构做错了。我是javascript的新手

2 个答案:

答案 0 :(得分: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)...附加到对象balanceRef的{​​{1}}事件。 当对象value的{​​{1}}事件被触发(即数据可用)时,您的函数balanceRef会被执行,但它的返回值无处可去,因为javascript解析器已经移动了

试试这个:

value

编辑2:为了避免回调链接,可以使用两个函数共有的变量。 (虽然这不是一个很好的练习,因为你不能确定这个值是否已经设定,当你想要的时候!)

function(snapshot)...

答案 1 :(得分:1)

在我看来,在你的点击事件中,你只会创建另一个“值”事件的监听器,众神知道该事件是如何以及何时被触发以及该函数何时返回你的mLeft。

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