繁体   English   中英

firebase 实时数据库事务不工作

[英]firebase realtime database transaction not working

我非常仔细地学习了教程,并且正在测试一个带有交易的“喜欢”功能。 然而,当我用 2 台设备对其进行测试时,计数似乎并没有很好地保持。

错误是当我在两个设备上单击“ like-button时,有时计数器会增加两倍,但那是计数器先上升然后下降使其增加 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应该只记录两次,一次 null 和一次当它检测到post时( Firebase 实时数据库事务处理程序大部分时间被调用两次

我相信我找到了答案。

我了解到 firebase 事务会运行多次直到成功(参考: https://firebase.google.com/docs/database/web/read-and-writeFirebase 事务在 NodeJS 中总是运行 3 次? ),因此我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;
        }
    }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM