2017-08-17 119 views
0

我有下面的代碼我試圖做一個簡單的計數器。但是,當我在本地運行它時,它不起作用。當我將newHits作爲空白時,它會引發錯誤:Uncaught錯誤:Reference.set失敗:第一個參數包含屬性'hits.number'中的未定義。 當我從1開始時,它不會改變數據庫中命中的值。任何幫助表示讚賞:我是編程新手。非常感謝!Firebase數據庫更改不起作用

$(document).ready(function(){ 
    var database = firebase.database(); 
    var hits; 
    var newHits = 1; 
    var hitsRef = firebase.database().ref('hits'); 
    hitsRef.once('value', function(snapshot){ 
    console.log("hitsRef.once called"); 
    hits = snapshot.val().number; 
    console.log("hits: "+hits); 
    newHits = hits+1; 
    console.log(newHits); 
    }); 
    hitsRef.set({ 
    number: newHits 
    }); 
}); 

回答

0

簡單的方式做到這一點通過交易看here

$(document).ready(function(){ 
    var database = firebase.database(); 
    var hitsRef = firebase.database().ref('hits/number'); 
    hitsRef.transaction(function(hits){ 
    console.log("hitsRef.once called"); 
    hits++; 
    return hits 
    }); 
} 
0

這是由於異步性質的一次()。根據你的代碼,once()和set()被同時調用相同的值i

如果你想測試它,把你的set()一個的setTimeout()中一樣,

setTimeout(function(){ 
     hitsRef.set({ 
     number: newHits 
     }); 
    }, 2000); 

你會看到你的問題就解決了,但這不是正確的way.Try此相反,當一次()完成檢索命中

var i = 1; 
    hitsRef.once('value', function(snapshot){ 
    console.log("hitsRef.once called"); 
    hits = snapshot.val().number; 
    console.log("hits: "+hits); 
    newHits = hits+1; 
    console.log(newHits); 
    }) 
    .then(function() {  // change starts here 
     hitsRef.set({ 
     number: newHits 
      }); 
     }); 

你set()方法纔會被調用。這是有效的,因爲once()返回一個承諾並且是可以接受的。

閱讀這些then() in javascriptpromises