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
Node.js Nodejs-这段代码的执行顺序是什么?异步等待循环的内部_Node.js_Express_Mongoose_Async Await - Fatal编程技术网

Node.js Nodejs-这段代码的执行顺序是什么?异步等待循环的内部

Node.js Nodejs-这段代码的执行顺序是什么?异步等待循环的内部,node.js,express,mongoose,async-await,Node.js,Express,Mongoose,Async Await,假设我们有一个模型“用户”,和一个模型“游戏” 一个用户可以有多个游戏,但一个游戏只属于一个用户 在“用户”模型中,我们有“gamesCount”字段——用户拥有的游戏总数 在“游戏”模型中,我们有与用户相关的字段userId 现在我们需要遍历所有用户,对于每个用户,我们查询“game”集合以获得该用户有多少个游戏,然后将值“gamesCount”保存到用户模型 我有两段代码: updateUserGamesCount: async function (req, res) { try {

假设我们有一个模型“用户”,和一个模型“游戏”

一个用户可以有多个游戏,但一个游戏只属于一个用户

在“用户”模型中,我们有“gamesCount”字段——用户拥有的游戏总数

在“游戏”模型中,我们有与用户相关的字段userId

现在我们需要遍历所有用户,对于每个用户,我们查询“game”集合以获得该用户有多少个游戏,然后将值“gamesCount”保存到用户模型

我有两段代码:

updateUserGamesCount: async function (req, res) {
    try {
        let users = await User.find({});
        for (let user of users) {
            user.gamesCount= await Game.count({userId: user._id});
            await user.save();
        }
        return res.status(200).send("Success");
    } catch (err) {
        res.status(500).send(err);
    }
}
第一段代码不起作用。它只是加载一段时间,然后请求超时。当我试图修改gamesCount值以查看它是否已更新时,在第一次运行代码段后,该值不会更新

updateUserGamesCount: async function (req, res) {
    try {
        let users = await User.find({});
        for (let user of users) {
            user.gamesCount= await Game.count({userId: user._id});
            user.save();
        }
        return res.status(200).send("Success");
    } catch (err) {
        res.status(500).send(err);
    }
}
这第二个片段很有效。唯一的区别是在第二个代码段中,我删除了wait before user.save()

为什么会发生这种情况?我认为user.save()是异步的,我们需要使用wait?这行代码的执行顺序到底是什么


非常感谢。

问:为什么第一个代码段有效,而另一个代码段无效

答:我认为我们需要弄清楚“it works”的定义。它之所以有效是因为没有抛出错误

我怀疑您的第二个代码片段根本不起作用,您只是通过删除
wait
关键字来掩盖错误

第一个示例之所以有效,是因为您正在等待
save
操作在继续之前完成,并且如果抛出
异常
,则它会被
try
块捕获。而第二个代码不再等待
save()
响应返回,只返回
success

如果这一理论成立,则不应成功保存任何内容。不管它是否有效,只有数据库才能说出真相。第1个代码段是正确的方法,但在性能方面可以做得更好

考虑捆绑所有
保存
承诺,并执行
承诺.all(…)
以获得可能的性能增益。或者,在某些用例中,执行包含所有修改的one
save
操作也是一个不错的选择


请参阅:

什么是“不起作用”?
User.save
是否返回承诺?@StephenCleary:我更新了我的问题。它只是加载一段时间,然后请求超时。当我试图修改gamesCount值以查看它是否更新时,在第一次运行代码片段后,该值不会更新。谢谢@Samuel Toh。事实上,我说第二个代码段是有效的,因为当我检查数据库时,gamesCount的所有值都是正确的。假设每次运行都有一个
clean
数据库,我不确定这是怎么回事。当您运行第一个代码时,根本没有填充任何内容?还是一些?如果是后者,那么可能是间歇性的问题。不,我试图将一些记录的值修改为错误的值。然后我运行第二个代码段。当我再次检查这些值时,它们是正确的。这就是为什么我必须提出这个问题,因为从我所了解的Promise或async/Await的内容来看,这没有什么意义。我认为最好在每次尝试之前将数据库回滚到干净的状态。我想你在比较的时候可能犯了一个错误。