首页 > 解决方案 > 如何将异步修复应用于循环?

问题描述

我被困在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

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

我的 index.hbs:

{{# each products }}
    Output text
{{/each}}

标签: javascriptnode.jsmongodbasynchronouscallback

解决方案


主要问题是在渲染页面中的产品比预期的要多。

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

您可以重写“保存逻辑”如下

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

推荐阅读