javascript - 如何将异步修复应用于循环?
问题描述
我被困在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}}
解决方案
主要问题是在渲染页面中的产品比预期的要多。
在您的数据库中,保存了多少产品?相同数量的渲染?如果是,则在您保存产品时会出现问题。
您可以重写“保存逻辑”如下
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());
推荐阅读
- html - 为什么 ::first-letter 在某些情况下以两个首字母为目标,而在另一种情况下以一个首字母为目标?
- selenium - 无法使用 follow-sibling 和 child 创建 appium-android xpath
- c - 从 ac 程序访问退出代码
- javascript - 字符串替换输入文本内
- javascript - 如何在reactjs(Web前端)中隐藏硬编码的系统帐户用户名/密码以直接连接到Mongodb
- python - 如何在 tkinter 中使用小部件的窗口固定位置?
- django - Django - 两个表之间的简单左连接
- java - IBM Mobilefirst JAVA 适配器在存储用户数据时给出 MFP-Conflict=Concurrency 失败
- kubernetes - 如何在没有 --dry-run 的情况下创建 kubernetes 服务 yaml 文件
- java - 可以考虑将此代码用于 Java 中的成员覆盖吗?