我有一组具有基于时间的派生属性的对象。
我有一个firebase云功能,正在聆听创建和写作以计算属性,并且运行良好。
我还添加了一个通过HTTP(例如Cron)触发的函数,以在周日清晨重新计算该物业(该属性将每周更改)。
这很好,但是每当CRON函数更新属性时,第一个功能就会捕获写入并重新完成整个计算。
有没有简单的方法来防止这种情况?我已经探索了设置一个环境变量,以检测到CRON是否运行的第一个函数,但是似乎无法在运行时设置环境变量。
您应该能够通过检查上一个值来防止这种情况。我将尝试提供一个示例
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数据库触发器的更多信息
警告:我的方法有点沉重,这可能需要对您的代码进行重构,因此绝对不是您的解决方案。但是我认为这仍然可能感兴趣您或将来的读者。
我通过使用"命令"(应该做的)和"事件"(发生了什么)来解决此问题。每个都有自己的集合,我的两个功能(a CommandsHandler
和a EventsHandler
)被订阅。
每个处理程序都处理命令和事件,并且可能会或可能不会根据他们所做的事情生成自己的事件和命令,从而使我完全绕过您描述的问题。
在您的情况下,它的行为如下:
更新
命令Update item 'Item' with 'blablabla'
->事件Item 'Item' updated
->命令Calculate property 'Property' for item 'Item'
->事件Property 'Property' updated in item 'Item'
cron
cron函数触发 ->命令Calculate property 'Property' for item 'Item'
->事件Property 'Property' updated in item 'Item'