我刚遇到一个奇怪的行为。我有一个MongoDB集合allCustomers
,并试图填充它,只要Customers.countDocuments()
返回的值小于3。模型和模式已导出且可以正确访问,因为它通过使用来添加条目if
,而不是while
。不幸的是,这不是我的要求,对我来说这也不合理。
let Customer = require('./models/customer');
router.get('/', function (req, res) {
Customer.countDocuments({}, function (err, count) {
while (count < 3) {
var emptySlot = new Customer({ name: 'Unused', gender: 'empty' });
emptySlot.save(function (err, slot) {
if (err) return console.error(err);
console.log(slot.name);
});
}
});
Customer.find({}, function (err, customers) {
..
});
});
答案 0 :(得分:1)
您在哪里初始化变量count
?
为了停止循环,在哪里增加变量count
?
您知道asynchronous javascript的工作原理吗?
while循环是一个同步任务,它将一直执行直到到达结尾(JavaScript 不是多线程)。每个实例化的异步任务将被临时保存在 event-loop 链中,并在同步任务完成时按顺序执行。
在您的情况下,即使您在count
回调中增加变量save
,循环仍将是无限的。由于同步任务永远不会结束,因此永远不会调用save
回调。
其结果是您拨打save
次无穷大次数,并且永不出门。
可以使用Promise.all