我有一组异步 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/