2013-10-04 46 views
1

我從我的火力正確的JavaScript函數結構

//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

+1

如何觸發您的事件'價值'? – webduvet

+0

點擊 var myTokensLeft = checkBalance() – user2320607

+0

Tibos- tokensLeft在那裏,當我在函數之外測試它時工作正常。 – user2320607

回答

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)...對象balanceRefvalue事件。 當對象balanceRefvalue事件被觸發(即數據可用)時,函數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 

    }); 

}()); 
+0

哈哈我只是想發佈相同的答案:) – Sherlock

+0

Dvlad感謝您的回答。我需要函數的值。我不能把點擊呼叫的其餘部分放在checkBalance(function(myTokensLeft){ – user2320607

+0

)中,你必須這樣做,它只是異步調用的方式。如果你能詳細說明你的需求,可能有另一種解決方案雖然 – lordvlad

1

在我看來,關於你的點擊事件中,你只能創建另一個監聽器「值「事件和上帝知道如何以及何時觸發了該事件,以及函數返回的是哪裏。

代碼中發生的事情是,在每次單擊「#grabit」之後,總是會創建新的偵聽器,但內部的函數不一定會被調用,如果調用它,則會被異步調用,這意味着時間它已完成,你已經有了「未定義」。