Firebase数据库侦听器被明显无阻塞的循环

时间:2017-03-04 21:26:01

标签: javascript node.js asynchronous firebase-realtime-database

我有一组异步的Firebase侦听器,它们监听我的数据库,并更新本地变量,因为他们会看到远程对应的更改。

听众在启动时附加,并且独立工作。只要看到更新,就会触发回调。

但是,我尝试编写一个无限运行的循环(在所有侦听器连接之后等)并使用由Firebase侦听器维护的变量在每个循环中执行操作。

我从初始尝试(基本的while循环)中了解到该节点是单线程的,因此正常的while循环阻塞,并阻止Node的事件循环触发。 我仔细研究了一些非阻塞的替代方案,并发现:

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

   process.nextTick(self.processingLoop);
}

这显然应该实现一个循环,同时也不会阻塞节点事件循环(因此不会阻塞Firebase监听器?),因为循环函数被放入回调队列中以最终执行,以及所有其他回调(我假设包含firebase事件回调)。 循环工作正常,但我的Firebase回调仍未在db更新时触发。

以下是循环运行时不再触发的回调示例:

 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监听器仍然被阻止(我假设?)使用这种方法? 任何帮助非常感谢

1 个答案:

答案 0 :(得分:1)

我通过替换

来解决这个问题
process.nextTick(self.processingLoop);

setTimeout(self.processingLoop, 0);

我读过process.nextTick只是setTimeout的优化版本,但它们似乎都表现出不同的行为(process.nextTick阻止Firebase监听器,而setTimeout不阻止)。

这不再是紧急的,但是有没有人有任何关于为什么会这样的理论?