(已解决)如何将异步修复应用于Node.js中的循环?

时间:2019-05-20 09:49:51

标签: javascript node.js mongodb asynchronous callback

我被卡在get文件中的某些代码(根据教程的 )上,该文件获得了首页(称为 index.js ),该文件引用了名为index.hbs包含遍历数组中列出的所有乘积的循环的文件),并且每次循环遍历列出的乘积时,都会呈现输出在主页上。

服务器提供的输出比我列出的产品更多。我知道这是因为product-seeder.js是异步的,但是当我使用教程中的代码(本来应该解决异步问题)并尝试加载服务器时,它只是一直加载并且不会停止。

我不知道为什么要这么做。我做错什么了吗?谢谢,非常感谢您的帮助。

我的javascript

index.js

我的var express = require('express'); var router = express.Router(); var Product = require('../models/product'); /* GET home page. */ router.get('/', function(req, res, next) { Product.find(function(err, docs) { res.render('shop/index', {title: 'Shopping Cart', products: docs}); }); }); module.exports = router;

product-seeder.js

我的index.hbs:

var Product = require('../models/product');

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/shopping', { useNewUrlParser: true });

var products = [
    new Product({
        imagePath: 'image.png',
        title: 'PD 1',
        description: 'Product 1',
        price: 1
    }),
    new Product({
        imagePath: 'image.png',
        title: 'PD 2',
        description: 'Product 2',
        price: 2
    }),
    new Product({
        imagePath: 'image.png',
        title: 'PD 3',
        description: 'Product 3',
        price: 3
    })
];

var done = 0;
for (var i = 0; i < products.length; i++) {
    products[i].save(function() {
        done++;
        if (done === products.length) {
            exit();
        }
    });
}

function exit() {
    mongoose.disconnect();
}

1 个答案:

答案 0 :(得分:0)

主要问题是,在呈现的页面中,有比预期更多的产品。

在您的数据库中,保存了多少产品?渲染量相同吗?如果是,则在保存产品时会发生此问题。

您可以按以下方式重写“保存逻辑”

const products = [/* .. things here .. */]

// This save one after another
async function save() {
    for (var i = 0; i < products.length; i++) {
        await products[i].save(); // this can generate an eslint warning/error
    }
}

// This save all products basically together, if products.length is > 10 can be a bad idea
async function save() {
    return Promise.all(products.map(prod => prod.save()));
}

save().then(() => mongoose.disconnect());