0

Webアプリでは、これがあります:

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

child_added イベントが即時であるかどうかを検出する 100% 信頼できる方法を探しています。これにより、push() の後で関数がすぐに呼び出される場合 (同期) と、関数が非同期で呼び出される場合の 2 つのケースを正しく処理できます。

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

ここまでで 2 つのオプションについて説明しましたが、どちらも確実に機能するはずです (以下の注を参照)。今後、これを簡単にする機能を追加する可能性がありますが、現時点では具体的な計画はありません。

いくつかのメモ:

  1. フラグの設定は正常に機能するはずです。同期コードの実行が完了するまで、非同期イベントは発生しません。try/finally ブロックを使用してリセットすることで、エラーの問題を回避できます。
  2. push() id は普遍的に一意になるように設計されているため、競合について心配する必要はありません。
于 2013-08-20T15:34:24.220 に答える