将对象推送到数组

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