Firebase数据库更改无法正常工作

时间:2017-08-17 17:55:10

标签: javascript firebase firebase-realtime-database

我有以下代码我试图制作一个简单的点击计数器。但是,当我在本地运行它时,它不起作用。当我将newHits作为空白启动时,它会抛出错误:未捕获错误:Reference.set失败:第一个参数包含未定义的属性' hits.number'。 当我从1开始时,它不会改变数据库中命中的值。任何帮助表示赞赏:我是编程新手。非常感谢!

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

2 个答案:

答案 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并且它是可以的。

阅读这些then() in javascriptpromises