我有一组具有基于时间的派生属性的对象。
我有一个Firebase云功能正在侦听创建和写入以计算属性,并且它运行良好。
我还添加了一个通过HTTP触发的函数,比如cron,在周日早上重新计算属性(此属性将每周更改一次)。
这很好用,但每当cron函数更新一个属性时,第一个函数会捕获write并重新进行整个计算。
有一种简单的方法可以防止这种情况发生吗?我已经探索了为第一个函数设置一个环境变量来检测cron是否正在运行,但似乎环境变量似乎不能在运行时设置。
答案 0 :(得分:2)
您应该可以通过检查以前的值来阻止这种情况。我试着提供一个例子
exports.yourFunction = functions.database.ref('/somepath/{someKey}').onWrite(event => {
if (event.data.previous.val().time != event.data.val().time) {
return;
}
else {
// perform calculation
}
});
总之,如果前一个值与当前值不同,则变量time
刚刚被其他函数更改。您需要将.time
更改为您的变量名称。
注意:这不会阻止函数触发,它只会阻止它再次执行计算。如果你根本不想要发射这个功能,那么你必须设计一种不同的计算方法。例如只计算它onCreate
然后在设定的时间间隔使用Cron来更新值。聆听onWrite
将导致每次将数据写入Firebase时触发该功能。
您可以阅读有关Firebase Database Triggers
的更多信息答案 1 :(得分:1)
警告::我的方法比较笨拙,可能需要重构代码,因此绝对不是您的解决方案。但是我认为您或未来的读者可能仍然会感兴趣。
我通过使用“命令”(应该做什么)和“事件”(已经发生的事情)来解决此问题。每个都有自己的集合,我的两个函数(CommandsHandler
和EventsHandler
)已订阅。
每个处理程序都会处理命令和事件,并且可能会或可能不会根据其所做的事情生成自己的事件和命令,这使我可以完全绕开您所描述的问题。
对于您来说,它的行为如下:
命令Update item 'Item' with 'blablabla'
->事件Item 'Item' updated
->命令Calculate property 'Property' for item 'Item'
->事件Property 'Property' updated in item 'Item'
定时功能触发器->命令Calculate property 'Property' for item 'Item'
->事件Property 'Property' updated in item 'Item'