我有以下代码我试图制作一个简单的点击计数器。但是,当我在本地运行它时,它不起作用。当我将newHits作为空白启动时,它会抛出错误:未捕获错误:Reference.set失败:第一个参数包含未定义的属性' hits.number'。 当我从1开始时,它不会改变数据库中命中的值。任何帮助表示赞赏:我是编程新手。非常感谢!
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
答案 0 :(得分: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
});
}
答案 1 :(得分:0)
这是由于once()的异步特性造成的。根据你的代码,一次()和set()被同时调用 i 的相同值。
如果要测试它,请将set()放在setTimeout()中,如
setTimeout(function(){
hitsRef.set({
number: newHits
});
}, 2000);
您将看到问题已解决,但这不是正确的方法。请尝试使用
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
});
});
只有在一次()完成检索 hits 时,才会调用set()方法。这是有效的,因为once()返回一个promise并且它是可以的。