0

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

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

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

我认为在 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 人员,他们是否通常可以将布尔“isImmediateEvent”传递给回调(在快照之后,prevChildName)。

托比

4

1 回答 1

2

您现在已经介绍了这两个选项,并且任何一个都应该可靠地工作(请参见下面的注释)。我们可能会在未来添加功能以使这更容易,但目前还没有具体计划。

几点注意事项:

  1. 设置标志应该可以正常工作。在您的同步代码完成运行之前,不会发生任何异步事件。您可以通过使用 try/finally 块来重置它来避免错误问题。
  2. push() id 的设计是普遍唯一的,所以你真的不应该担心冲突。
于 2013-08-20T15:34:24.220 回答