Firebase javascript应用程序中文档状态的时间变化

时间:2019-05-27 04:14:02

标签: javascript firebase google-cloud-firestore google-cloud-functions

我正在创建一个游戏,在该游戏中,用户在作为游戏实例的Firestore文档中的自己的设备上相互搏斗。问题是我想创建一个牢不可破的解决方案来及时更改游戏状态。因此,真理的源头应该是救火。

游戏创建者指示的状态很少(创建,计数),但是经过数秒钟的计数后,我需要在没有用户操作的情况下设置一些状态。所以下一个状态是inProgress,得分摘要。

const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp()

exports.gameStateChanger = functions.firestore
    .document('rooms/{roomId}')
    .onUpdate((change, context) => {

      const roomId = context.params.roomId
      const roomRef = admin.firestore().collection('rooms').doc(roomId)

      const newValue = change.after.data()
      console.log(newValue)

      const oldValue = change.before.data()

      if(newValue.game.status==='counting') {
          setTimeout(() => {
              console.log('timeout 5s')
              roomRef.update({state: 'inProgress'})
              setTimeout(() => {
                  roomRef.update({state: 'scoreSummary'})
              }, 60000)
          }, 5000)
      }
    })

我试图编写一个Firebase函数,但是由于时间执行的限制,云函数中的setTimeout并不是最佳解决方案。我还看到在aprils更新中有一个Firebase计划,但是我想在特定用户单击后每隔几秒钟更改状态一次,该计划也很昂贵。

也许有人对类似的解决方案有一定的经验,会告诉应该走哪条路?

1 个答案:

答案 0 :(得分:0)

您的代码似乎表明您正在寻找大约65秒的延迟。在这种情况下,您可以将函数的超时时间增加到稍大于65秒的时间:https://firebase.google.com/docs/functions/manage-functions#set_timeout_and_memory_allocation

另一种选择是通过调用服务器端函数让客户端代码每隔几秒钟轮询一次。服务器端功能将检查数据库,以查看是否经过了正确的时间。如果有的话,该函数可以更新数据库中的“状态”字段,或者简单地将新状态返回给客户端。