Обновить значения Firestore, когда приложение свернуто / закрыто - PullRequest
0 голосов
/ 18 февраля 2020

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

Случай: Как обновить поля в Firestore, когда приложение работает в фоновом режиме или когда он закрыт?

Краткое описание: Время ввода пользователем (миллисекунды), и по истечении этого времени я хочу обновить поля в Firestore независимо от того, запущено приложение или закрыто, у меня в настоящее время есть этот код :

 private void setTaskEndTime(long xEndTime) {
        long mLeftTime = xEndTime - mCurrentTime;

        new CountDownTimer(mLeftTime, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
                updateCountDownText();
            }

            @Override
            public void onFinish() {
                //HERE <===================

            }
        }.start();

    }

Я пробовал использовать Firebase Cloud Function; так что, когда время истекло, предполагалось обновить поля, но проблема в том, что облачной функции требуется слишком много времени для обновления полей (или, по крайней мере, моего кода):

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

exports.wtf = functions.region('europe-west1').firestore
    .document('Users/{userId}/Tasks/{docId}')
    .onUpdate((docSnapshot, context) => {
        var mUserID = context.params.userId;  //Document userID
        var mDocID = context.params.docId;    //Document taskID

        var oldSnapshot = docSnapshot.before.data();
        var oldCurrentStatus = oldSnapshot.taskCurrentStatus;
        var newSnapshot = docSnapshot.after.data();
        var newCurrentStatus = newSnapshot.taskCurrentStatus;

        var tempTime = newSnapshot.temporaryTime;

        let cityRef = db.collection('Users').doc(mUserID).collection('Tasks').doc(mDocID);

        if (newCurrentStatus !== oldCurrentStatus && newCurrentStatus > 0) {


            const myFunc = () => {
                //Gets dd/MM/yyyy date and stores it in 'today'
                var today = new Date();
                var dd = String(today.getDate()).padStart(2, '0');
                var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
                var yyyy = today.getFullYear();
                today = dd + '/' + mm + '/' + yyyy;

                let days = cityRef.update({
                    taskCompletedDays: admin.firestore.FieldValue.arrayUnion(today)
                });
                let hours = cityRef.update({
                    taskCompletedHours: admin.firestore.FieldValue.increment(tempTime)
                });
                let status = cityRef.update({ taskCurrentStatus: 0 });
            }

            setTimeout(myFunc, tempTime);

        }
        return true;
    });

1 Ответ

2 голосов
/ 18 февраля 2020

Код, запланированный с setTimeout, не гарантирует правильного выполнения в облачных функциях. Фоновая облачная функция (включая триггеры Firestore) должна возвращать обещание, которое разрешается, когда вся асинхронная работа завершена . После этого любая ожидающая работа может быть отменена или просто не выполнена правильно. Короче говоря, не зависите от setTimeout, если только вы 1) не готовы вернуть обещание, которое разрешается только после завершения работы, и 2) никогда не превысит максимально настраиваемый 9-минутный таймаут для облачных функций.

Вместо этого вы должны использовать облачные задачи Google для планирования будущего вызова другой (HTTP) функции по истечении определенного промежутка времени. Вы можете прочитать подробное описание в этом блоге .

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