我有一組異步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);
不勝感激
您是否有一些Firebase代碼可供評估? – deezy
@deezy我附加了一個被循環阻止的Firebase偵聽器示例。希望這可以幫助 –