我正在创建一个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关闭它。
但是我该怎么做?有更简单的方法吗?
答案 0 :(得分:1)
您可以轻松选择添加标志,表明您已更新数据。下次进入该函数时,首先检查是否存在该标志,如果是,则退出该函数。这个的结果是你将运行至少n + 1
的函数另一种选择,根据他们的最新帖子,你知道有一个" onUpdate"和" onCreate"触发器也是如此。您可以巧妙地使用它们来进一步优化它(例如:仅在第一次创建时执行XYZ,因此它不会在每次更新时运行)。
https://firebase.googleblog.com/2017/07/cloud-functions-realtime-database.html
答案 1 :(得分:1)
就像你说的那样,onWrite将捕获每一个写作事件。我的解决方案是用onCreate替换onWrite,但让用户写入另一个路径,因为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。再说一次:您需要将其写入另一条路径。