Я создал приложение для 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
});
}
})
})
})