我在 Nodejs 中使用递归超时函数,但它没有按预期工作



我有一个从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)的方式。以这种方式构造代码可以使流程更容易理解。

最新更新