2017-03-04 84 views
0

我有一組異步Firebase偵聽器,它們偵聽我的數據庫,並更新本地變量,以便更改其遠程對應的目錄。Firebase數據庫偵聽器被明顯無阻塞的迴路阻塞

偵聽器在啓動時連接,並獨立工作。無論何時發生更新,回調都會觸發。我試圖編寫一個無限期運行的循環(在所有監聽器被連接等之後),並使用由Firebase偵聽器維護的變量在每個週期執行操作。

我從我的初始嘗試(一個基本的while循環)瞭解到,該節點是單線程的,因此正常的while循環被阻塞,並且阻止Node的事件循環被觸發。 我看看一輪某些無阻塞的替代品,結果發現:

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

    process.nextTick(self.processingLoop); 
} 

這應該顯然實現循環,同時也不能阻斷節點事件循環(因此不堵火力地堡聽衆?),作爲循環函數放入回調隊列中以最終執行,以及所有其他回調(我假設它們會包含Firebase事件回調函數)。 該循環正常工作,但是我的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... 

有誰知道爲什麼我的火力地堡偵聽器(我假設?)使用這種方法仍然受阻? 任何幫助與

setTimeout(self.processingLoop, 0); 

,我讀了process.nextTick只是setTimeout的優化版本替換

process.nextTick(self.processingLoop); 

不勝感激

+0

您是否有一些Firebase代碼可供評估? – deezy

+0

@deezy我附加了一個被循環阻止的Firebase偵聽器示例。希望這可以幫助 –

回答

1

我解決了這個問題,但他們似乎都展現出不同的行爲(process.nextTick阻止Firebase偵聽器,而setTimeout不是)。

這不再緊急,但是有沒有人有任何理論說明爲什麼會出現這種情況?