我从我的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的新手
答案 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”之后总是会创建新的监听器,但是里面的函数不一定要被调用,如果它被调用,它就会被异步调用,这意味着到时候它你已经完成了“未定义”。