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