2017-03-04 63 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不是)。

这不再紧急,但是有没有人有任何理论说明为什么会出现这种情况?