我有一组异步Firebase侦听器,它们侦听我的数据库,并更新本地变量,以便更改其远程对应的目录。Firebase数据库侦听器被明显无阻塞的回路阻塞
侦听器在启动时连接,并独立工作。无论何时发生更新,回调都会触发。我试图编写一个无限期运行的循环(在所有监听器被连接等之后),并使用由Firebase侦听器维护的变量在每个周期执行操作。
我从我的初始尝试(一个基本的while循环)了解到,该节点是单线程的,因此正常的while循环被阻塞,并且阻止Node的事件循环被触发。 我看看一轮某些无阻塞的替代品,结果发现:
self.processingLoop = function()
{
//do stuff
process.nextTick(self.processingLoop);
}
这应该显然实现循环,同时也不能阻断节点事件循环(因此不堵火力地堡听众?),作为循环函数放入回调队列中以最终执行,以及所有其他回调(我假设它们会包含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...
有谁知道为什么我的火力地堡侦听器(我假设?)使用这种方法仍然受阻? 任何帮助与
setTimeout(self.processingLoop, 0);
,我读了process.nextTick只是setTimeout的优化版本替换
process.nextTick(self.processingLoop);
不胜感激
您是否有一些Firebase代码可供评估? – deezy
@deezy我附加了一个被循环阻止的Firebase侦听器示例。希望这可以帮助 –