如何检测child_added事件是否是本地的?

时间:2013-08-20 11:39:38

标签: firebase

在网络应用中,我有这个:

function onChildAdded(snapshot) {
  // ...
}
someFirebaseLocation.on('child_added', onChildAdded);

我正在寻找一种100%可靠的方法来检测child_added事件是否是立即的,这样我就可以正确处理这两种情况:当在push()之后立即调用函数(sync)与函数获取时叫做异步。

我认为在push()调用之前设置一个标志是不可靠的。 (当异步事件进入时潜在的竞争条件,并且当出现错误时标志可能不会被重置)。

另一种选择是

var pushed = push(...);

然后在child_added

if (snap.name() === pushed)

但是传入的消息可能具有相同的.name()因此可能存在冲突。冲突的可能性值得商榷,但我更倾向于采用简单而无懈可击的方式来获取信息。

如果我能做到这一点会很棒:

function onChildAdded(snapshot, prevChildName, isImmediateEvent) {
  if (isImmediateEvent) {
    // Handle as sync event.
  } else {
    // Handle as async event.
  }
}
someFirebaseLocation.on('child_added', onChildAdded);

或者

function onChildAdded(snapshot, prevChildName) {
  if (snapshot.isFromImmediateEvent) {
    // Handle as sync event.
  } else {
    // Handle as async event.
  }
}
someFirebaseLocation.on('child_added', onChildAdded);

还有其他可靠的选择吗?否则我会问Firebase人员他们是否通常可以将bool“isImmediateEvent”传递给回调(在snapshot,prevChildName之后)。

托比

1 个答案:

答案 0 :(得分:2)

您现在已经涵盖了两个选项,其中一个应该可靠地工作(请参阅下面的注释)。我们可能会在将来添加功能以使其更容易,但此时没有具体计划。

一对夫妇注意到:

  1. 设置标志应该可以正常工作。在同步代码完成运行之前,不会发生异步事件。您可以使用try / finally块重置它来避免错误。
  2. push()id的设计是普遍唯一的,所以你真的不应该担心冲突。