X0r*_*r0N 0 javascript arrays loops mongodb node.js
我在将新记录保存到 mongoDB 时遇到问题。我很确定我在代码中使用了一些我不完全理解的东西,我希望有人能够提供帮助。
我正在尝试为每只猫将新记录保存到 mongoDB 中。这段代码适用于node.js
for(var x = 0; x < (cats.length - 1); x++){
if (!blocked){
console.log("x = "+x);
var memberMessage = new Message();
memberMessage.message = message.message;
memberMessage.recipient = room[x].userId;
memberMessage.save(function(err){
if (err) console.log(err);
console.log(memberMessage + " saved for "+cats[x].name);
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
我在循环之前记录“cats”的值,并且确实得到了我期望的所有名称,因此我认为循环遍历数组将为每个循环存储一个新记录。
似乎发生的情况是,当我查看数据库时,它似乎只保存了每个循环周期的最后一条记录。我不知道它会如何/为什么这样做。
感谢您对此的任何帮助,因为我是 node.js 和 mongoDB 的新手。
谢谢。
那是因为它save实际上是一个异步的 I/O 操作。现在,for循环实际上是同步的。这样想:你的 JS 引擎串行执行它看到的每一行。假设这些行被一个接一个地保存在堆栈上。当涉及到 时save,它将其保留在不同的堆栈上(因为它是 I/O 操作,因此需要时间)并继续循环的其余部分。事实证明,引擎只会在完成旧堆栈上的每一行后才会检查这个新堆栈。因此,变量的值cats将是数组中的最后一项。因此,仅保存最后一个值。
为了对抗这一悲剧,您可以使用多种方法:
cats.forEach()请注意#2 - 我不是该项目的贡献者,但与作者合作。我已经使用该库一年多了,它快速且非常棒!
| 归档时间: |
|
| 查看次数: |
2559 次 |
| 最近记录: |