我有一组异步的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监听器仍然被阻止(我假设?)使用这种方法? 任何帮助非常感谢
答案 0 :(得分:1)
我通过替换
来解决这个问题process.nextTick(self.processingLoop);
与
setTimeout(self.processingLoop, 0);
我读过process.nextTick只是setTimeout的优化版本,但它们似乎都表现出不同的行为(process.nextTick阻止Firebase监听器,而setTimeout不阻止)。
这不再是紧急的,但是有没有人有任何关于为什么会这样的理论?