изменения статуса документа во времени в приложении javascript firebase - PullRequest
0 голосов
/ 27 мая 2019

Я создаю игру, в которой пользователи сражаются друг с другом на собственных устройствах в документе firestore, который является экземпляром игры. Проблема в том, что я хочу создать нерушимое решение, чтобы вовремя менять статус игры. Так что источником истины должен быть пожарный магазин.

Существует несколько статусов, указанных создателем игры (создано, считается), но после нескольких секунд подсчета мне нужно установить несколько статусов без действий пользователя. Поэтому следующие статусы - inProgress, scoreSummary.

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 в облачной функции - не лучшее решение из-за ограничений по времени выполнения. Я также вижу, что в обновлении от апреля есть расписание Firebase, но я хочу менять статусы через несколько секунд после того, как конкретный пользователь нажимает не каждые несколько секунд, и расписание также дорогое.

Может быть, кто-то имеет некоторый опыт работы с подобными решениями и скажет, в какую сторону идти?

1 Ответ

0 голосов
/ 28 мая 2019

Ваш код, кажется, показывает, что вы ищете задержки около 65 секунд.В этом случае вы можете увеличить время ожидания для своей функции до значения, немного превышающего 65 секунд: https://firebase.google.com/docs/functions/manage-functions#set_timeout_and_memory_allocation

Другой вариант - разрешить опрос кода вашего клиента каждые несколько секунд, вызывая серверную часть.функция.Функция на стороне сервера проверит базу данных, чтобы узнать, прошло ли правильное количество времени.Если это так, функция может обновить поле «состояние» в базе данных или просто вернуть новое состояние клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...