将对象推送到数组
Pushing an Object to the array
如果我 console.log 我的 cartProducts 在 forEach() 循环中,那么它工作正常,它存储所有产品。但是如果我 console.log 我的 cartProducts 在循环之外,那么它会打印一个空数组。
var cartProducts = [];
const cart = await CartModel
.findOne({ UserDetailsId: userID })
.populate('UserDetailsId');
if (cart) {
cart.products.forEach(async(product) => {
const productItem = await ProductModel
.findOne({_id: product.productDetailsId });
cartProducts.push(productItem);
});
}
console.log("Cart Items", cartProducts);
尝试通过以下方式获取所有产品 ID:
const productIds = cart.products.map(product => product.productDetailsId);
然后您可以一次获取所有产品项目,而无需向数据库发送多个请求:
const products = await ProductModel.find({_id: {$in: productIds} });
要做到这一点,你需要让你的 forEach 异步
if (cart) {
async function asyncForEach(arr) {
const promises = arr.products.forEach(async(product) => {
const productItem = await ProductModel
.findOne({_id: product.productDetailsId });
cartProducts.push(productItem);
});
await Promise.all(promises);
}
asyncForEach(cart);
}
function mockAsync(param) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(console.log(param)), 2000)
})
}
let cart = ["A", "B", "C"];
async function asyncForEach(arr) {
console.log("processing...")
const promises = arr.forEach(async(product) => {
await mockAsync(product);
});
await Promise.all(promises)
}
asyncForEach(cart);
如果我 console.log 我的 cartProducts 在 forEach() 循环中,那么它工作正常,它存储所有产品。但是如果我 console.log 我的 cartProducts 在循环之外,那么它会打印一个空数组。
var cartProducts = [];
const cart = await CartModel
.findOne({ UserDetailsId: userID })
.populate('UserDetailsId');
if (cart) {
cart.products.forEach(async(product) => {
const productItem = await ProductModel
.findOne({_id: product.productDetailsId });
cartProducts.push(productItem);
});
}
console.log("Cart Items", cartProducts);
尝试通过以下方式获取所有产品 ID:
const productIds = cart.products.map(product => product.productDetailsId);
然后您可以一次获取所有产品项目,而无需向数据库发送多个请求:
const products = await ProductModel.find({_id: {$in: productIds} });
要做到这一点,你需要让你的 forEach 异步
if (cart) {
async function asyncForEach(arr) {
const promises = arr.products.forEach(async(product) => {
const productItem = await ProductModel
.findOne({_id: product.productDetailsId });
cartProducts.push(productItem);
});
await Promise.all(promises);
}
asyncForEach(cart);
}
function mockAsync(param) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(console.log(param)), 2000)
})
}
let cart = ["A", "B", "C"];
async function asyncForEach(arr) {
console.log("processing...")
const promises = arr.forEach(async(product) => {
await mockAsync(product);
});
await Promise.all(promises)
}
asyncForEach(cart);