リモートの相手に変更が発生したときに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...
誰でも知っていますか? すべてのヘルプは大幅に
評価のために表示するfirebaseコードがありますか? – deezy
@deezyループでブロックされているFirebaseリスナーの例を添付しました。お役に立てれば –