Функции Firebase - добавление нового значения к старому значению

1

Я создаю приложение для Android, которое регистрирует, сколько времени человек тратит на определенные вещи. Я хочу добавить время, потраченное на общее время, поэтому я знаю, сколько времени пользователь потратил на тип упражнения, я хочу сделать это в функции, так как я думаю, что это проще, чем транзакции.

exports.addExerciseTime = functions.database.ref('users/{userid}/stats/exerciseTime/{type}').onWrite( event =>{
        console.log("Exercise time updates...");
        var newdata = event.data.val();
        var oldData = event.data.previous.val();
        return event.data.ref.update(oldData+ newdata);
    });

Теперь я знаю, что эта функция будет зацикливаться до тех пор, пока firebase не выключит ее.

Но как мне это сделать? Есть ли более простой способ сделать это?

Теги:
firebase
google-cloud-functions
firebase-realtime-database

2 ответа

1

у вас есть простая возможность добавить флаг, указывающий, что вы обновили данные. в следующий раз, когда вы войдете в функцию, просто начните с проверки наличия флага, если это так, выйдите из функции. con из этого состоит в том, что вы запустите функцию по крайней мере n + 1

другой вариант, согласно их последнему сообщению, вы знаете, есть триггеры onUpdate и onCreate. вы могли бы использовать их умнее, чтобы оптимизировать это еще больше (например: только при первом создании делают XYZ, поэтому он не будет запускаться при каждом обновлении).

https://firebase.googleblog.com/2017/07/cloud-functions-realtime-database.html

1

Как вы говорите, onWrite будет захватывать каждое событие записи. Мое решение заменило бы onWrite на onCreate, однако пусть пользователь пишет на другой путь, потому что Firebase будет продолжать запускать эту функцию. Кроме того, ваш подход - это не лучшее решение, так как обновления могут конфликтовать. Использование транзакций лучше. Это будет выглядеть так:

exports.addExerciseTime = functions.database.ref('users/{userid}/stats/exerciseTime/{type}').onCreate( event =>{
        console.log("Exercise time updates...");
        var newdata = event.data.val();
        const pathToValue = //create the path here to exercisetime
        return pathToValue.transaction(function(exercisetime) {
        return (exercisetime || 0) + newdata;
       });
    });

* Обратите внимание на событие onCreate вместо onWrite. Опять же: вам нужно будет записать его на другой путь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню