Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当应用程序最小化/关闭时更新Firestore值_Javascript_Java_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Javascript 当应用程序最小化/关闭时更新Firestore值

Javascript 当应用程序最小化/关闭时更新Firestore值,javascript,java,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Java,Firebase,Google Cloud Firestore,Google Cloud Functions,试着找出哪一个适合我的情况 案例:当应用程序在后台运行或关闭时,如何更新Firestore上的字段? 简短描述:用户输入时间(毫秒),当该时间结束时,我想更新Firestore中的字段,无论应用程序是否正在运行或关闭,我当前有以下代码: private void setTaskEndTime(long xEndTime) { long mLeftTime = xEndTime - mCurrentTime; new CountDownTimer(mLeftTi

试着找出哪一个适合我的情况

案例:当应用程序在后台运行或关闭时,如何更新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();

    }

使用setTimeout调度的代码不能保证在云函数中正确执行。后台云函数(包括Firestore触发器)。在此之后,任何挂起的工作都可能被取消或根本无法正确执行。简而言之,不要依赖于
setTimeout
,除非你1)愿意返回一个承诺,该承诺只有在工作完成后才能解决,2)永远不会超过云功能可配置的最大9分钟超时


相反,您应该使用Google云任务来安排在经过一段时间后调用另一个(HTTP)函数。您可以阅读中的详细说明。

使用setTimeout调度的代码不能保证在云函数中正确执行。后台云函数(包括Firestore触发器)。在此之后,任何挂起的工作都可能被取消或根本无法正确执行。简而言之,不要依赖于
setTimeout
,除非你1)愿意返回一个承诺,该承诺只有在工作完成后才能解决,2)永远不会超过云功能可配置的最大9分钟超时


相反,您应该使用Google云任务来安排在经过一段时间后调用另一个(HTTP)函数。您可以在中阅读详细的描述。

我已经查看了一点博客和文档,尽管我认为这对于我的简单新手项目来说有点过分,但我将尝试相应地实现和更新此主题(这肯定需要时间,因为所有这些术语听起来太复杂)。谢谢你的帮助!由于setTimeout不起作用,如果您需要精确地安排工作,这实际上是正确执行此操作最简单的方法。我已经仔细查看了博客和文档,尽管我认为这对我的简单新手项目来说有点过分,但我将试着实现并相应地更新此主题(这肯定需要时间,因为所有这些术语听起来都太复杂了)。感谢您的帮助!因为setTimeout不起作用,如果您需要精确地安排工作,这实际上是正确执行此操作最简单的方法。
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;
    });