计时器在Firebase功能上

时间:2018-03-29 07:50:41

标签: node.js firebase-realtime-database google-cloud-functions

我想在firebase云功能上创建一个倒数计时器 我该怎么做?

我正在使用firebase使用java制作移动应用程序。我想在我的应用程序中添加一个计时器,向所有用户显示相同的时间。但在这个问题上,我只想显示一个计算数据库时间的计时器

如何使用firebase云功能制作此计时器 的更新 我做到了这一点,但cmd中有一个错误

       const functions = require('firebase-functions');
      const admin=require('firebase-admin');

    admin.initializeApp(functions.config().firebase);   

      exports.myCloudTimer = 
     functions.database.ref('/startTimerRequest/').onCreate((event) => {
return db.ref('cloudTimer/timeInMs').once('value', snap => {
    if (!snap.exists()) {
        return Promise.reject('time is not defined in the database.');
    }

    let timeInSeconds = snap.val() / 1000;
    console.log('Cloud Timer was Started: ' + timeInSeconds);

    return functionTimer(timeInSeconds,
        elapsedTime => {
            db.ref('cloudTimer/observableTime').set(elapsedTime);
        })
        .then(totalTime => {
            console.log('Timer of ' + totalTime + ' has finished.');
        })
        .then(() => new Promise(resolve => setTimeout(resolve, 1000)))
        .then(() => event.data.ref.remove())
        .catch(error => console.error(error));
});
        });

       function functionTimer (seconds, call) {
        return new Promise((resolve, reject) => {
         if (seconds > 300) {
        reject('execution would take too long...');
        return;
           }
            let interval = setInterval(onInterval, 1000);
            let elapsedSeconds = 0;

        function onInterval () {
        if (elapsedSeconds >= seconds) {
            clearInterval(interval);
            call(0);
            resolve(elapsedSeconds);
            return;
        }
        call(seconds - elapsedSeconds);
        elapsedSeconds++;
    }
          });
                }

1 个答案:

答案 0 :(得分:1)

好的,首先到这里:https://firebase.google.com/docs/functions/并了解功能是什么以及如何部署自己的功能。

然后部署这个' myCloudTimer'功能..

exports.myCloudTimer = functions.database.ref('/startTimerRequest/').onCreate((event) => {
    return db.ref('cloudTimer/timeInMs').once('value', snap => {
        if (!snap.exists()) {
            return Promise.reject('time is not defined in the database.');
        }

        let timeInSeconds = snap.val() / 1000;
        console.log('Cloud Timer was Started: ' + timeInSeconds);

        return functionTimer(timeInSeconds,
            elapsedTime => {
                db.ref('cloudTimer/observableTime').set(elapsedTime);
            })
            .then(totalTime => {
                console.log('Timer of ' + totalTime + ' has finished.');
            })
            .then(() => new Promise(resolve => setTimeout(resolve, 1000)))
            .then(() => event.data.ref.remove())
            .catch(error => console.error(error));
    });
});

function functionTimer (seconds, call) {
    return new Promise((resolve, reject) => {
        if (seconds > 300) {
            reject('execution would take too long...');
            return;
        }
        let interval = setInterval(onInterval, 1000);
        let elapsedSeconds = 0;

        function onInterval () {
            if (elapsedSeconds >= seconds) {
                clearInterval(interval);
                call(0);
                resolve(elapsedSeconds);
                return;
            }
            call(seconds - elapsedSeconds);
            elapsedSeconds++;
        }
    });
}

然后通过创建名为startTimerRequest:(put any value here)

的节点对其进行测试

enter image description here

然后你应该看到observableTime从7倒数到1倒数,0紧随其后,请求会自行删除。

所以你的所有Android用户都必须这样做,观察/cloudTimer/observableTime值,某人或某事必须触发倒数计时器。您可以手动触发它,或让用户触发它,或者让某个功能触发它,这取决于您想要触发它的方式和时间。

警告:此代码不是很安全,请添加安全措施,例如防止多个请求,或者太长时间的功能执行(成本)等...但它应该可以工作并让你开始。