【问题标题】:Firebase Database Listeners blocked by apparently non-blocking loopFirebase 数据库侦听器被明显的非阻塞循环阻塞
【发布时间】:2017-03-04 21:26:01
【问题描述】:

我有一组异步 Firebase 侦听器,它们侦听我的数据库,并在见证远程对等项的更改时更新本地变量。

侦听器在启动时附加,并且可以独立工作。每当见证更新时,回调就会触发。

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

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

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

   process.nextTick(self.processingLoop);
}

这显然应该实现一个循环,同时也不会阻塞节点事件循环(因此不会阻塞 Firebase 侦听器?),因为循环函数被放入回调队列中以最终执行,以及所有其他回调(我假设它包含了 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...

有谁知道为什么我的 Firebase 监听器仍然被阻止(我假设?)使用这种方法? 非常感谢任何帮助

【问题讨论】:

  • 您有一些 Firebase 代码要显示以供评估吗?
  • @deezy 我附上了一个被循环阻塞的 Firebase 监听器的例子。希望这会有所帮助

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


【解决方案1】:

我通过替换解决了这个问题

process.nextTick(self.processingLoop);

setTimeout(self.processingLoop, 0);

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

这不再紧急,但有没有人有任何理论来解释为什么会这样?

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 2018-03-27
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2014-03-28
    • 2015-10-16
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多