Javascript 如何使用forEach和Mongoose查询计算最终价格?
我有一个困难的最终价格计算问题与猫鼬查询。我有三个功能。这一个得到了一个ID和外部数量,找到了材料的价格,并最终将其叠加Javascript 如何使用forEach和Mongoose查询计算最终价格?,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我有一个困难的最终价格计算问题与猫鼬查询。我有三个功能。这一个得到了一个ID和外部数量,找到了材料的价格,并最终将其叠加 async function getPrivatePrice(id, quantity) { try { let piece = await Piece.findOne({'_id': id}).select({"meterage": 1, "material": 1, "_id" : 0}).then((piece) => { return p
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: [] } }
}
显然,您需要重构代码。我要做的是使用像蓝鸟这样的东西在碎片列表上运行一个地图,就像这样
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;
}
}
很明显,我无法按原样测试这段代码。但我认为应该非常直接地告诉您发生了什么(我认为)那么这里的最终目标是什么
pieces
是一个包含\u id
和quantity
值的数组,您需要返回加在一起的总成本,或者确切返回什么?我只想说你做得不对,所以最好显示你的输入和预期输出。基本的解决方法是let piece\u price=wait getFinalCost(product.pieces)代码>因为您误解了这样一个概念,即您实际上没有在“承诺”中解析值。然而,这段代码确实需要一些关于整体重构的指导。@NeilLunn,我仍然会在{total_array:[]
中遇到同样的错误,我需要先知道如何在forEach完成后返回总成本
,这就是为什么我要求您提供更多细节。您不需要forEach()
在这里,您实际上可以要求数据库在没有所有请求的情况下执行此操作。这应该只需要一个异步调用。您是对的,片段是一个包含\u id
和数量的数组,当它们通过forEach时,它们在getPrivatePrice
处执行,正如您所看到的,该函数会找到饼图ce
材质
和计量,然后是材质
的价格和倍数price*meterage
,最后是该值和数量…因此,函数返回该数字,我需要所有这些数字以供以后使用,或者可能会获得有效的createProduct
函数的最终价格,但我仍然需要获得priceList
arrayEasy Peasy的每个项目的摘要。您在priceList数组中拥有所有需要的信息来解决这个问题。您可以在数组上运行reduce操作以获得所有项目的总和