2017-03-04 4 views
0

リモートの相手に変更が発生したときにdbをリッスンし、ローカル変数を更新する一連の非同期Firebaseリスナーがあります。明らかにノンブロッキングループによってブロックされたFirebaseデータベースリスナー

リスナーは起動時に接続され、独立して動作します。コールバックは、更新が目撃されるたびに発生します。

しかし、(すべてのリスナーが接続された後に)無期限に実行されるループを作成しようとしており、Firebaseリスナーが管理する変数を使用して各サイクルを実行します。

ノードがシングルスレッドなので、通常のwhileループはブロックされていて、Nodeのイベントループが起動しないようにしています。 私はいくつかの非ブロック代替用ルックラウンドを持っていたが見つかりました:

self.processingLoop = function() 
{ 
    //do stuff 

    process.nextTick(self.processingLoop); 
} 

これは明らかに、ノードイベントループをブロックしていない(したがってFirebaseリスナーをブロックしていない?)、としながら、ループを実装する必要がありますループ関数は、最終的に実行されるコールバック・キューに置かれ、他のすべてのコールバック(ファイア・ベース・イベント・コールバックをエンコードしていると仮定しています)を呼び出します。 ループは正常に動作しますが、Firebaseのコールバックはdbのアップデートではまだ起動されていません。ここで

は、ループが実行されている一方で、もはや発射されたコールバックの例です:私のFirebaseリスナーがまだ(?私は仮定)ブロックされている理由は、このアプローチを使用して

self.attachMovementKeyListenerToCharacter = function(characterRefName, character, movingCharacters) 
    { 
     console.log("CharacterDao: Attaching MovementKeyListener to character: " + characterRefName); 
     var characterMovementKeyStateRef = self.charactersRef.child(characterRefName + "/state/keyState/movementKeyState"); 

     //When a movementKey event fires, add or remove the player from the movingCharactersList 
     characterMovementKeyStateRef.on('child_changed', function(snapshot) 
     { 
      var keyThatWasPressed = snapshot.key; 
      var newKeyValue = snapshot.val().value; 
      var timestamp = snapshot.val().lastUpdated; 

      console.log("Key event: " + keyThatWasPressed + " detected for character: " + characterRefName); 

      //DO STUFF... 

誰でも知っていますか? すべてのヘルプは大幅に

+0

評価のために表示するfirebaseコードがありますか? – deezy

+0

@deezyループでブロックされているFirebaseリスナーの例を添付しました。お役に立てれば –

答えて

1

に感謝私はprocess.nextTickは単にsetTimeoutメソッドの最適化バージョンであったことを読んで、彼らは異なる両方の展示に思える

setTimeout(self.processingLoop, 0); 

process.nextTick(self.processingLoop); 

を交換することによって、これを固定しました(process.nextTickはFirebaseリスナに対してブロックしていますが、setTimeoutはそうではありません)。

これはもはや緊急ではありませんが、なぜこれが当てはまるかについての理論はありますか?

関連する問題