可以在NodeJS路由中使用“ while”吗?

时间:2019-10-23 07:53:56

标签: javascript node.js mongodb mongoose

我刚遇到一个奇怪的行为。我有一个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) {
            ..
    });
});

1 个答案:

答案 0 :(得分:1)

  1. 您在哪里初始化变量count

  2. 为了停止循环,在哪里增加变量count

  3. 您知道asynchronous javascript的工作原理吗?

while循环是一个同步任务,它将一直执行直到到达结尾(JavaScript 不是多线程)。每个实例化的异步任务将被临时保存在 event-loop 链中,并在同步任务完成时按顺序执行。

在您的情况下,即使您在count回调中增加变量save,循环仍将是无限的。由于同步任务永远不会结束,因此永远不会调用save回调。

其结果是您拨打save次无穷大次数,并且永不出门。

可以使用Promise.all

实施更好的解决方案