javascript - 如何使用 forEach 和 Mongoose 查询计算最终价格?
问题描述
我对 Mongoose Queries 有一个困难的最终价格计算问题。我有三个功能。这个得到一个ID和外部数量,找到材料价格,最后乘以它。
async function getPrivatePrice(id, quantity) {
try {
let piece = await Piece.findOne({'_id': id}).select({"meterage": 1, "material": 1, "_id" : 0}).then((piece) => {
return piece;
}).catch((err) => {
console.log(err);
});
let price = await Material.findOne({'_id': piece.material}).select({"_id" : 0, "price" : 1}).then((price) => {
return price;
}).catch((err) => {
console.log(err);
});
let final_raw = piece.meterage * price.price;
let final_price = final_raw * quantity;
return { final_price : final_price }
} catch(err) {
console.log(err);
}
}
我真的对代码的第二部分有困难,因为我需要从另一个函数中获取许多 id,所以,我决定使用 forEach 来调用这个函数,并获取所有这些价格并将它们放入一个数组中,但我不知道如何退货。
async function getFinalCost(pieces) {
let total_cost = [];
try {
pieces.forEach(async (response) => {
let query = await PieceController.getPrivatePrice(response["_id"], response["quantity"]).then((piecePrice) => {
return piecePrice["final_price"];
}).catch((err) => {
console.log(err);
});
total_cost.push(query);
});
return total_cost;
} catch(err) {
console.log(err);
}
}
我想知道如何在这里获取该数组:
function createProduct(req, res) {
let params = req.body;
let product = new Product();
product.name = params.name;
product.reference = params.reference;
product.pieces = params.pieces;
product.color = params.color;
let piece_price = getFinalCost(product.pieces);
console.log(piece_price); //Outputs Promise { { total_array: [] } }
}
解决方案
你显然需要重构你的代码。我要做的是使用像 bluebird 这样的东西在片段列表上运行地图。
const Promise = require('bluebird');
async function getMoreProductInfo(id) {
try{
const productInfo = await Piece.findOne({'_id': id}).select({"meterage": 1, "material": 1, "_id" : 0});
const materialInfo = await Material.findOne({'_id': productInfo.material}).select({"_id" : 0, "price" : 1});
return { productInfo, materialInfo };
} catch(e) {
throw e;
}
}
async function calculatePrices(pieces) {
try {
const priceList = await Promise.map(pieces, async (piece) => {
const { productInfo, materialInfo } = await getMoreProductInfo(piece._id);
return materialInfo.price * piece.quantity * productInfo.meterage;
});
return priceList
} catch (e) {
throw e;
}
}
我显然无法按原样测试此代码..但我认为告诉发生了什么应该很简单(我认为)
推荐阅读
- javascript - 使用离子标签时,Ionic 4 + vue.js / ion-button 不可点击?
- typescript - 获取Angular中对象的属性类型
- apache - 将 site.com/board 重定向到 newsite.com
- python - 如何使用部分 URL 来过滤模型?(使用美味派)
- reactjs - React 无法通过 Match 访问我的 url 参数(?)
- javascript - 微妙加密货币.encrypt() 在 MS Edge 中失败,但在 Chome 中工作
- python - 无法使用 os.system 运行放置在文件夹 anaconda/scripts 中的脚本
- graphql - GraphQL 操作名称是否会改变查询行为?
- spring-boot - spring cloud consul中是否有禁用发现的标志?
- amazon-web-services - 现在有没有办法在 boto3 中获取 RDS 的所有“AWS 区域名称”?