Как вернуть одну переменную из функции FireBase в цикл forEach? - PullRequest
0 голосов
/ 09 марта 2019

Я создал приложение для iOS, которое использует Firebase, и написал облачную функцию Firebase, которая отправляет уведомление всем пользователям приложения, когда в приложении появляется новый элемент (публикация). Я не хочу, чтобы пользователи получали слишком много уведомлений, поэтому функция Firebase также экономит время уведомления в базе данных. Когда функция запускается, она извлекает время последнего уведомления и отправляет новое уведомление только в том случае, если прошло минимальное количество времени (в настоящее время 24 часа).

Моя проблема заключается в получении переменной из цикла forEach, в частности значения последнего времени уведомления (переменная 'epoch2' в приведенном ниже коде). Я не вижу значения за пределами цикла forEach. Я потратил пару часов, пытаясь решить эту проблему, в том числе пытаясь передать значение в массив, объявленный вне цикла. Но даже это не помогло, значение не было видно, как только я вышел из цикла.

Единственное решение, которое я смог получить, - поместить остальную часть моего кода (второй цикл forEach, который проходит по всем пользователям и отправляет уведомления) внутри первого цикла forEach. Мой код ниже. Это технически работает и выполняет то, что я хочу, но это кажется неуклюжим и кажется не "правильным" способом сделать это.

Есть ли лучший / более простой способ извлечь одно значение из первого цикла forEach, которое затем может остаться видимым в остальной части функции? Буду признателен за любые предложения.

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

// function to send notification when there is a new post
exports.sendNotification = functions.database.ref('/posts/{postId}').onCreate((snapshot, context) => {

  // current time
  var epoch1 = Math.round((new Date()).getTime() / 1000);

  // retrieve time of last notification from database
  admin.database().ref("notifications").orderByKey().limitToLast(1).on('value', function(snap1) {
    snap1.forEach(function(childNodes1) {

      var epoch2 = childNodes1.val().date;

      var timeSinceLastNotification = epoch1 - epoch2;

      // only send new notification if it has been at least 24 hours since last one
      if (timeSinceLastNotification >= 86400) {

        var payload = {
          notification: { title: 'New Post', body: 'A new post is available' }
        };

        // loop through all users
        admin.database().ref("users").on('value', function(snap2) {

          snap2.forEach(function(childNodes2) {

            var fcmToken = childNodes2.val().fcmToken;

            // only send a notification if they have an fcmToken in the database
            if (fcmToken) {
              // SEND NOTIFICATION
            }
          })
        })

        // record notification in the database
        var newNotification = admin.database().ref('notifications').push();
        newNotification.set({
          'date': epoch1
        });

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