Javascript 如何正确地解除firebase云函数执行的抖动
我有一个Firebase云函数,它根据Firebase的 我的函数工作正常,每次更改都会按编写时的方式执行 尽管如此,根据Firebase的建议: •去抖动-在云Firestore中收听实时更改时,此解决方案可能会触发多个更改。如果这些更改触发的事件比您想要的多,请手动取消对Cloud Firestore事件的缓冲 我想这样做 谁能提供一个好的方法 如果我们根据Firebase的示例查看此函数:Javascript 如何正确地解除firebase云函数执行的抖动,javascript,firebase,google-cloud-functions,debounce,Javascript,Firebase,Google Cloud Functions,Debounce,我有一个Firebase云函数,它根据Firebase的 我的函数工作正常,每次更改都会按编写时的方式执行 尽管如此,根据Firebase的建议: •去抖动-在云Firestore中收听实时更改时,此解决方案可能会触发多个更改。如果这些更改触发的事件比您想要的多,请手动取消对Cloud Firestore事件的缓冲 我想这样做 谁能提供一个好的方法 如果我们根据Firebase的示例查看此函数: exports.onUserStatusChanged = functions.database.r
exports.onUserStatusChanged = functions.database.ref('/status/{uid}').onUpdate(
async (change, context) => {
// Get the data written to Realtime Database
const eventStatus = change.after.val();
// Create a reference to the corresponding Firestore document
const userStatusFirestoreRef = firestore.doc(`status/${context.params.uid}`);
// re-read the current data and compare the timestamps.
const statusSnapshot = await change.after.ref.once('value');
const status = statusSnapshot.val();
// If the current timestamp for this data is newer than
// the data that triggered this event, we exit this function.
if (status.last_changed > eventStatus.last_changed) {
return null;
}
// Otherwise, we convert the last_changed field to a Date
eventStatus.last_changed = new Date(eventStatus.last_changed);
// write it to Firestore
userStatusFirestoreRef.get().then((user: any) => {
user.forEach((result: any) => {
result.ref.set(eventStatus, { merge: true })
});
});
return;
});
我应该如何尝试消除它的执行力
我可以尝试解除.onUpdate()
事件的抖动吗
我原以为以下几点就足够了:
functions.database.ref('/status/{uid}').onUpdate(
debounce(async(change:any, context:any) => {
...
}, 10000, {
leading: true,
trailing: false
})
);
但是,感谢@doug stevenson指出,尝试以这种方式消除onUpdate事件的影响将不起作用,原因如下:
“这是行不通的,因为函数的每次调用都可能发生在完全不同的服务器实例中,没有共享上下文。”由于每个事件可能会多次传递,因此必须跟踪中提供的事件ID。如果您看到重复的事件,您就知道它正在重复 要做到这一点,有几十种策略,而不是只有一种正确的方法。您可以将处理后的ID存储在数据库或其他持久性存储中,但不能仅将其存储在内存中,因为每个函数调用都可以彼此完全隔离 还可以阅读“幂等性”,因为这是函数的属性,在每次调用时,函数的行为都是相同的
如果说重复的context.eventId构成重复的事件,那么重复的是什么?对同一解析路径(如ref(“/status/UID12345”)、更新/更改的数据或两者都必须为真(相同解析路径,相同尝试的数据更改)的执行,事件id才能重复传递给函数的整个事件。个人与此无关。抱歉,该评论应该说“个人路径与此无关”。好的,如果我理解正确,我需要考虑一个事实,即事件可能会重复,这可以通过匹配eventId检测到,因此在我的情况下,id是否需要确保我仅对尚未“处理”的唯一EventID执行去抖动?通过“已处理”,我引用的是您的链接视频教程,而我可以将eventid与数据一起存储,作为跟踪事件是否已完成的一种方式。是的,您将希望忽略以前记录了成功处理事件的调用。