Javascript 我正在制作一个网站,用于与firebase玩纸牌游戏,我使用的是实时数据库,但当有人抽到一张牌时,它会形成一个无休止的循环

Javascript 我正在制作一个网站,用于与firebase玩纸牌游戏,我使用的是实时数据库,但当有人抽到一张牌时,它会形成一个无休止的循环,javascript,html,firebase,firebase-realtime-database,playing-cards,Javascript,Html,Firebase,Firebase Realtime Database,Playing Cards,当有人抽一张卡片(shift函数)时,比如cardDeck.shift();它从玩家的牌组中取出一张牌,然后从实时数据库中取出一张,通知与他竞争的用户从牌组中取出一张牌。我觉得这是最好的方法,而不是每次有人抽牌时都要把整个牌组都装进去。但正如你很容易看到的,这会产生一个无止境的循环。数据库需要调用相同的函数,否则当对手抽牌时,玩家的函数将不会更新。你对此有什么建议吗?提前谢谢 我理解为什么它一直在呼唤自己。我想知道另一种方法。我还没有想到一个 class Deck{ shift(){

当有人抽一张卡片(shift函数)时,比如cardDeck.shift();它从玩家的牌组中取出一张牌,然后从实时数据库中取出一张,通知与他竞争的用户从牌组中取出一张牌。我觉得这是最好的方法,而不是每次有人抽牌时都要把整个牌组都装进去。但正如你很容易看到的,这会产生一个无止境的循环。数据库需要调用相同的函数,否则当对手抽牌时,玩家的函数将不会更新。你对此有什么建议吗?提前谢谢

我理解为什么它一直在呼唤自己。我想知道另一种方法。我还没有想到一个

class Deck{
    shift(){
        let temp = this.cards.shift();
        this.syncShift();
        return temp;
    }

    syncShift(){
        dbDeck.child('cards').child(String(mainDeck.cards.length-1)).remove();
    }
    }

dbDeck.child('cards').on('child_removed', function (snap) {
    console.log(snap.val());
    mainDeck.shift();
})
cardDeck.shift();

提前谢谢

而不是调用shift,它从我手中取出一张卡,然后从数据库中取出一张卡。把它直接从数据库中拿出来,这反过来又把它从我手中夺走。翻转顺序,它将起作用。

“分而治之”。操作“拾取卡片”可分为3个子操作:

  • 从UI中删除卡
  • 本地移除卡(从类中)
  • 从数据库中删除卡
  • 知道了这一点,我们就可以为每个子动作创建函数:

  • removecardfromuui
  • removeCardFromMemory
  • removeCardFromDb
  • 我们仍将为主操作调用函数
    shift
    ,为另一个操作调用函数
    syncShift

    让我们假设这副牌保存在db中,两个玩家共享同一副牌

    class Deck {
      removeCardFromUI() {
        var deck; //the UI deck
        deck.child('cards').child(String(mainDeck.cards.length - 1)).remove();
      }
      //remove card from memory
      removeCardFromMemory() {
        let temp = this.cards.shift();
        return temp;
      }
      //your function that syncs the db
      removeCardFromDb(card) {
        //however you do it here
      }
      shift() {
        this.removeCardFromUI();
        let temp = this.removeCardFromMemory();
        this.removeCardFromDb(temp);
        return temp
      }
      syncShift() {
        this.removeCardFromUI();
        this.removeCardFromMemory();
      }
    }
    cardDeck.shift();
    

    现在,让我们假设
    P1
    选择了一张卡。然后,我们将为
    P1
    调用
    shift()
    ,您可以看到,它将调用
    removecardfromuui
    removecardfromummory
    removeCardFromDb
    。在这之后,一旦数据库被更新,我们将调用
    syncShift
    获取
    P2
    。这将依次调用
    removeCardFromUI
    removeCardFromMemory
    。不再
    从数据库中删除卡片,因为这将触发一个无休止的循环。

    拥有自己的本地副本可能是个坏主意。在任何应用程序中,每一条信息只有一个权威来源是至关重要的,不必要的缓存可能会造成混乱。如果必须在下一个操作开始之前更新数据库,那么缓存不会给您带来太多好处。Firebase“实时数据库”之所以被称为“实时数据库”,是因为它是专门为保持多个客户端实时同步而设计的。按预期使用它的功能,相信谷歌会比你做得更好。

    据我所见,有一个循环,shift->syncShift->shift,shift()调用syncShift(),然后它将其移除一张卡,这会触发“child_removed”并再次调用shift()。玩家有单独的数据库吗?他们是如何得救的?如果您能向我们展示您的表模式,那就太好了。没有太多可展示的了。它只是一个称为p1Hand、p2Hand、deck和center hand的变量。否则这就是我一周前才开始做的。不,玩家没有单独的dbs。尽管这可能是个好主意