Отправка объекта в массив - PullRequest
0 голосов
/ 09 июля 2020

Если я console.log my cartProducts в forEach () l oop, он работает нормально и хранит все продукты. Но если я console.log my cartProducts вне l oop, то он печатает пустой массив.

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

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Попробуйте получить все идентификаторы продуктов по:

const productIds = cart.products.map(product => product.productDetailsId);

Тогда вы можете получить все элементы продукта один раз, не отправляя несколько запросов в БД:

const products = await ProductModel.find({_id: {$in: productIds} }); 
0 голосов
/ 09 июля 2020

Для этого вам нужно сделать свой forEach asyn c

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