Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确地解除firebase云函数执行的抖动_Javascript_Firebase_Google Cloud Functions_Debounce - Fatal编程技术网

Javascript 如何正确地解除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

我有一个Firebase云函数,它根据Firebase的

我的函数工作正常,每次更改都会按编写时的方式执行

尽管如此,根据Firebase的建议:

•去抖动-在云Firestore中收听实时更改时,此解决方案可能会触发多个更改。如果这些更改触发的事件比您想要的多,请手动取消对Cloud Firestore事件的缓冲

我想这样做

谁能提供一个好的方法

如果我们根据Firebase的示例查看此函数:

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与数据一起存储,作为跟踪事件是否已完成的一种方式。是的,您将希望忽略以前记录了成功处理事件的调用。