Установите значение ребенка после сортировки от другого ребенка - PullRequest
0 голосов
/ 01 сентября 2018

То, что я хочу сделать, это вытащить верхнюю тройку в questsLeaderboard, отсортированную по score, а затем заменить существующих потомков в questsTop этими новыми верхними 3.

Так что если questsLeaderboard выглядит так:

- questsLeaderboard
  - uid1
    - score: 12
    ...
  - uid2
    - score: 3
    ...
  - uid3
    - score: 10
    ...
  - etc

И я хочу questsTop выглядеть так:

- questsTop
  - first
    - score: 12
    ...
  - second
    - score: 10
    ...
  - third
    - score: 3
    ...

Я пробовал это:

export const updateBoards = functions.https.onRequest((req, res) => {
  let questsArr = [];
  const questsRef = db.ref('questsLeaderboard');
  const questsTopRef = db.ref('questsTop');


  questsRef.orderByChild('score').limitToLast(3).on('child_added', (snapshot) => {
    questsArr.unshift(snapshot);
  });

  if (questsArr.length === 3) {
    questsTopRef.set({
      first: questsArr[0],
      second: questsArr[1], 
      third: questsArr[2]
    })
    .then(() => {
      res.status(200).send('top quests set');
    })
    .catch(err => {
      res.status(500).send(err);
    })
  }

})

Но это дает ошибку тайм-аута. Что я могу сделать?

1 Ответ

0 голосов
/ 01 сентября 2018

Вы не можете надежно использовать on() в облачных функциях, так как слушатель останется активным. Также: что будет с вашим кодом, если набрано менее 3 баллов? if (questsArr.length === 3) никогда не будет истинным, и вы никогда не отправите результат обратно клиенту.

Вместо этого вы захотите использовать once("value" слушатель, например:

export const updateBoards = functions.https.onRequest((req, res) => {
  let questsArr = [];
  const questsRef = db.ref('questsLeaderboard');
  const questsTopRef = db.ref('questsTop');


  return questsRef.orderByChild('score').limitToLast(3).once('value', (snapshot) => {
    snapshot.forEach(function(child) {
      questsArr.unshift(child);
    })
    return questsTopRef.set({
      first: questsArr[0],
      second: questsArr[1], 
      third: questsArr[2]
    })
    .then(() => {
      return res.status(200).send('top quests set');
    })
    .catch(err => {
      return res.status(500).send(err);
    })
  });
})

Вы также заметите, что я добавил операторы return ко всем асинхронным операциям с базой данных, чтобы облачные функции поддерживали вашу функцию до завершения чтения и записи. Подробнее об этом см. Второй пример в этом разделе документации .

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