我有一个从mongo-db:获取用户计数的函数
let totalOnlinePlayers = 0;
async function GetTotalOnlinePlayers() {
totalOnlinePlayers = await db.GetTotalOnlinePlayers();
setTimeout(GetTotalOnlinePlayers, constants.timeToUpdateOnlineCount);
}
let x = GetTotalOnlinePlayers();
在db中,函数为:
let GetTotalOnlinePlayers = async function () {
return User.collection.estimatedDocumentCount();
};
并且它如预期的那样工作。
但我使用在另一个vps上运行的mongo服务器,当我通过停止mongo服务器超过15-20s来重新启动它时,超时不再执行。
当我重新启动节点服务器时,它再次正常工作但问题是,我在节点服务器中使用套接字,然后重新启动它会断开游戏中的玩家,有时还会扰乱我的游戏逻辑。
我可以避免重新启动mongoserver,但我很好奇是什么导致了这个问题。
当数据库不可用时,.estimatedDocumentCount()
方法可能会抛出异常。
尝试像这样的重构
let totalOnlinePlayers = 0;
async function GetTotalOnlinePlayers() {
while(true) {
try {
totalOnlinePlayers = await User.collection.estimatedDocumentCount();
} catch (e) {
console.log ('error in await .estimatedDocumentCount()', e, 'retrying')
}
await new Promise(r => setTimeout(r, constants.timeToUpdateOnlineCount));
}
}
然后,它是异步函数中的一个循环,具有简单的逻辑,用于轮询数据库并等待。这个
await new Promise(r => setTimeout(r, delayInMilliseconds));
是在异步javascript中拼写await sleep(delayInMilliseconds)
的方式。以这种方式构造代码可以使流程更容易理解。