2017-08-17 87 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