Nodejs – 这个代码中的执行顺序是什么? asynchronous在内部等待循环

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

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

在“用户”模式中,我们有场“gamesCount” – 用户拥有的游戏总数

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

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

我有2个代码片段:

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); } } 

这第二个片段的作品。 唯一的区别是在第二个片段中,我删除user.save()之前的await;

为什么会发生? 我认为user.save()是asynchronous的,我们需要使用await? 这些代码行的执行顺序究竟是什么?

非常感谢你。

问:为什么第一个代码段工作,而不是其他?

答:我认为我们需要明确“有效”的定义 。 它的工作原因是没有错误被抛出?

我怀疑你的第二个代码片段根本不工作,而只是通过删除await关键字来掩盖错误。

第一个例子是因为在继续之前等待save操作完成,并且如果引发exception,则它被try块捕获。 而第二个代码不再等待save()响应返回并简单地返回success

如果这个理论成立,那么没有任何事情能够成功地saved 无论是否有效,只有数据库可以说实话。 第一个代码片段是正确的方法,但它可以做更好的性能明智。

考虑捆绑所有save承诺,并做一个promise.all(...) 可能的性能增益。 另外做一个save操作,包括所有的修改,在某些使用情况下也是一个不错的select。

请参阅: https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all