Firebase实时数据库事务不起作用

时间:2020-06-10 03:48:58

标签: javascript firebase firebase-realtime-database

我非常仔细地遵循了本教程,并且正在通过事务测试“赞”功能。但是,当我用2台设备对其进行测试时,该计数似乎并不理想。

错误是当我在两个设备上都单击like-button时,有时计数器会增加2,但是有时计数器却先增加然后递减,使计数器增加0(实际上有两个类似的按钮)。当同时按下两个不喜欢的按钮时,也会出现类似的问题。

同时取消两个按钮的喜欢也可能导致计数器增加两个,而计数器应减少两个。

var liked; // global variable to check if button has been liked

document.getElementById("like-button").onclick = function () {
        console.log("click");
        database.ref("brands/" + brand + "/" + dealId).transaction(function(post) {
            console.log("post:" , post);
            if (post) {
              if (post.likes && liked) {
                post.likes--;
                liked = false;
              } 
              else {
                post.likes++;
                liked = true;
              }
            }
            return post;
          });
    }

考虑到我非常仔细地跟踪了此事务,因此想知道这里出了什么问题。 https://firebase.google.com/docs/database/web/read-and-write

编辑:我有JSON

Brand3
  Brand3ID  
    impressions:  0
    likes:  16
    views:  0

更新:当我同时在2台设备上单击按钮时,我注意到post记录了3次-可能可以解释处理全局标志失败的原因,但仍然无法解决原因。通常post仅应记录两次,当它检测到postFirebase realtime database transaction handler gets called twice most of the time)时记录为空,然后记录一次

1 个答案:

答案 0 :(得分:1)

我相信我找到了答案。

我了解到,直到成功,firebase事务将运行多次(引用:https://firebase.google.com/docs/database/web/read-and-writeFirebase transactions in NodeJS always running 3 times?),因此我的liked标志始终根据交易成功。

我通过提取标记来解决它,因此它不依赖于已运行的事务数。

var liked; // global variable
    document.getElementById("like-button").onclick = function () {
        if (liked){
            database.ref("brands/" + brand + "/" + dealId).transaction(function(post) {
                if (post) {
                  if (post.likes) {
                    post.likes--;
                  } 
                }
                console.log("post:" , post);
                console.log("liked: ", liked);
                return post;
              });
              liked = false;
        }
        else{ // not liked
            database.ref("brands/" + brand + "/" + dealId).transaction(function(post) {
                if (post) {
                  if (post.likes) {
                    post.likes++;
                  } 
                }
                console.log("post:" , post);
                console.log("liked: ", liked);
                return post;
              });
              liked = true;
        }
    }

如果有更优雅的方法,请随时告诉我。