簡體   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