Arhn - архитектура программирования

Сложный запрос более чем одного дочернего элемента в облачных функциях

Вот структура моей базы данных firebase:

/UserData
  /DeviceMgmt
      /Counters
          /NumberOfAll:
          /NumberOfSelected
          /TotalDownloaded
        ...
      /Devices
          /pushId1
            /uid
            /signOutTime
            /toSelect=true (optional)
            /downloaded
            /lastDownload

          /pushId2
          /pushId3
           ...

И это моя облачная функция:

exports.markDevicesForDownload = functions.database.ref('/UserData/DeviceMgmt/Counters/NumberOfSelected').onUpdate( (change) => {

   const changeRef = change.after.ref;              
   const deviceMgmtRef = changeRef.parent.parent;   // /UserData/DeviceMgmt

   if (change.after.val() === 0 ) { //NumberOfSelected gets 0 value

        return deviceMgmtRef.once('value')
            .then((snap) => {

                const devicesRef = snap.child('Devices').ref;

                var average;
                var numberOfAllDevices;
                var totalDownloaded;

                numberOfAllDevices = snap.child('Counters/NumberOfAll').val();
                totalDownloaded = snap.child('Counters/TotalDownloaded').val();
                average = Math.round(totalDownloaded/numberOfAllDevices);

                return devicesRef
                        .orderByChild('signOutTime')
                        .equalTo(0)
                        .once('value',(devices) => {
                        return devices.ref
                                .orderByChild('downloaded')
                                .endAt(average)
                                .once('value',(devices) => {
                                    devices.forEach((device) => {
                                        device.child('toSelect').ref.set(true);
                                    });
                        });
                });
            });

   } else {
       return false;
   }

});

Функция срабатывает, когда счетчик NumberOfSelected = 0; Это происходит, когда ни под одним из устройств pushId нет дочернего элемента toSelect. Затем запрос для дочернего элемента downloaded заставляет все устройства с downloaded меньше среднего установить toSelect=true.

Я хотел ограничить устройства только теми, у которых signOutTime равно 0. Почему-то этот запрос не работает и учитываются все устройства.

Что я сделал не так???


Ответы:


1

Я бы поместил все асинхронные задачи в массив обещаний, а затем вернул их все, когда все задачи будут выполнены:

exports.markDevicesForDownload = functions.database.ref('/UserData/DeviceMgmt/Counters/NumberOfSelected').onUpdate((change) => {
  const changeRef = change.after.ref;
  const deviceMgmtRef = changeRef.parent.parent; // /UserData/DeviceMgmt
  if (change.after.val() === 0) { //NumberOfSelected gets 0 value
    return deviceMgmtRef.once('value')
      .then((snap) => {
        const promises = [];
        const devicesRef = snap.child('Devices').ref;
        var average;
        var numberOfAllDevices;
        var totalDownloaded;
        numberOfAllDevices = snap.child('Counters/NumberOfAll').val();
        totalDownloaded = snap.child('Counters/TotalDownloaded').val();
        average = Math.round(totalDownloaded / numberOfAllDevices);
        const dR = devicesRef
          .orderByChild('signOutTime')
          .equalTo(0)
          .once('value', (devices) => {
            const dW = devices.ref
              .orderByChild('downloaded')
              .endAt(average)
              .once('value', (devices) => {
                devices.forEach((device) => {
                  if (device.child("signOutTime").val() === 0){
                    promises.push(device.child('toSelect').ref.set(true));
                  }
                });
              });
              promises.push(dW);
          });
          promises.push(dR);
          return Promise.all(promises);
      });
  } else {
    return false;
  }
});
24.07.2018
  • Спасибо, решение работает!!! dR/dW — это аббревиатуры для запросов чтения/записи устройства, верно? 30.09.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..