javascript - Firebase 数据库监听器被明显非阻塞循环阻止

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

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

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

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

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

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

   process.nextTick(self.processingLoop);
}

这显然应该实现一个循环,同时也不会阻塞 Node 事件循环(因此不会阻塞 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 监听器仍然被阻止(我猜是?)? 非常感谢任何帮助

最佳答案

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

process.nextTick(self.processingLoop);

setTimeout(self.processingLoop, 0);

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

这不再紧急,但是有人有任何理论可以解释为什么会出现这种情况吗?

关于javascript - Firebase 数据库监听器被明显非阻塞循环阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42601596/

相关文章:

javascript - lodash _.remove 不适用于对象内容

javascript - 如何在android模拟器上运行HTML+CSS+JAVASCRIPT元素

javascript - Node - 切换到 ES6 模块时的 Protractor "SyntaxError: Cannot use import statement outside a module"

node.js - jaydata odata-server newsreader 示例抛出没有方法 'basicAuth' 异常

node.js - 用于项目和部署特定变量的 Azure DevOps 管道

c# - 非异步执行路径能否在 "async"方法中返回同步结果

javascript - Scrapy从javascript脚本中提取数据

javascript - 格式化信用卡输入 JS 或 jQuery

C++同时输入输出到控制台窗口

javascript - 服务器测试中如何处理setInterval