Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 我正在Nodejs中使用递归超时函数,但它没有按预期工作_Node.js_Mongodb_Socket.io_Settimeout - Fatal编程技术网

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

Node.js 我正在Nodejs中使用递归超时函数,但它没有按预期工作,node.js,mongodb,socket.io,settimeout,Node.js,Mongodb,Socket.io,Settimeout,我有一个从mongo db获取用户计数的函数: let totalOnlinePlayers = 0; async function GetTotalOnlinePlayers() { totalOnlinePlayers = await db.GetTotalOnlinePlayers(); setTimeout(GetTotalOnlinePlayers, constants.timeToUpdateOnlineCount); } let x = GetTotalOnline

我有一个从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-20秒来重新启动它时,超时不再执行

当我重新启动节点服务器时,它再次正常工作 但问题是,我在nodeserver中使用socket,重新启动它会断开游戏中玩家的连接,有时还会弄乱游戏逻辑

我可以避免重新启动mongoserver,但我很好奇是什么导致了这个问题。

当数据库不可用时,您的.estimatedDocumentCount方法可能会引发异常

试着像这样重构

让TotalOnlinePlayer=0; 异步函数getToTalonLinePlayer{ whiletrue{ 试一试{ TotalOnlinePlayer=等待用户.collection.estimatedDocumentCount; }抓住e{ console.log“wait.estimatedDocumentCount中出错”,e“重试” } 等待新Promiser=>setTimeoutr,constants.timeToUpdateOnlineCount; } } 然后,在异步函数中,它是一个循环,具有简单的逻辑,用于轮询数据库并等待。这个

await new Promise(r => setTimeout(r, delayInMilliseconds)); 
是在异步javascript中拼写await sleepDelayin毫秒的方式。以这种方式构造代码可以使流程更容易理解