【问题标题】:firebase realtime database transaction not workingfirebase 实时数据库事务不工作
【发布时间】:2020-06-10 13:30:45
【问题描述】:

我非常密切地按照教程进行操作,并且正在测试交易中的“点赞”功能。但是,当我用 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 应该只记录两次,一次为空,一次为检测到post (Firebase realtime database transaction handler gets called twice most of the time)

【问题讨论】:

  • 您共享的代码乍一看还不错。您如何看待这个问题?
  • 我正在查看我的实时数据库中点赞数的变化,并在两个不同的设备上点击了点赞按钮
  • 我确实注意到了一个问题 - 在点击两个设备(几次)后,全局 liked 标志似乎甚至对于一个设备来说都搞砸了 - “喜欢”会导致计数
  • 会不会是事务失败时没有处理liked全局标志?
  • 很难说出了什么问题,因为代码看起来不错。你能:1)编辑你的问题以在/brands/$brand/$dealId包含JSON(作为文本,没有截图)。您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。 2)看看你是否可以在像jsbin这样的网站上设置一个最小的问题重现?

标签: javascript firebase firebase-realtime-database


【解决方案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;
        }
    }

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

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 2021-07-13
    • 1970-01-01
    • 2021-05-20
    • 2019-05-15
    • 2020-09-19
    • 2018-12-29
    • 2018-12-25
    • 2021-03-10
    相关资源
    最近更新 更多