Javascript 将对象推送到数组中

Javascript 将对象推送到数组中,javascript,arrays,push,Javascript,Arrays,Push,如果我在forEach()循环中记录我的产品,那么它工作正常,并存储所有产品。但是如果我在循环之外记录我的产品,那么它将打印一个空数组 var cartProducts=[]; const cart=等待CartModel .findOne({UserDetailsId:userID}) .populate('UserDetailsId'); 如果(购物车){ cart.products.forEach(异步(产品)=>{ const productItem=等待产品模型 .findOne({u

如果我在forEach()循环中记录我的产品,那么它工作正常,并存储所有产品。但是如果我在循环之外记录我的产品,那么它将打印一个空数组

var cartProducts=[];
const cart=等待CartModel
.findOne({UserDetailsId:userID})
.populate('UserDetailsId');
如果(购物车){
cart.products.forEach(异步(产品)=>{
const productItem=等待产品模型
.findOne({u id:product.productDetailsId});
cartProducts.push(productItem);
});
}
console.log(“购物车项目”,购物车产品);

尝试通过以下方式获取所有产品ID:

const productIds = cart.products.map(product => product.productDetailsId);
然后,您可以一次性获取所有产品项,而无需向数据库发送多个请求:

const products = await ProductModel.find({_id: {$in: productIds} }); 

尝试通过以下方式获取所有产品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); 
}
函数mockAsync(param){
返回新承诺((解决、拒绝)=>{
setTimeout(()=>resolve(console.log(param)),2000)
})
}
让购物车=[“A”、“B”、“C”];
异步函数asyncForEach(arr){
日志(“处理…”)
const promises=arr.forEach(异步(产品)=>{
等待mockAsync(产品);
});
等待承诺。所有(承诺)
}

异步foreach(cart)要这样做,需要使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); 
}
函数mockAsync(param){
返回新承诺((解决、拒绝)=>{
setTimeout(()=>resolve(console.log(param)),2000)
})
}
让购物车=[“A”、“B”、“C”];
异步函数asyncForEach(arr){
日志(“处理…”)
const promises=arr.forEach(异步(产品)=>{
等待mockAsync(产品);
});
等待承诺。所有(承诺)
}

异步foreach(cart)
异步
循环使用本机for循环。它可能打印一个空数组,因为您正在将对象异步推送到数组中,因此过早地将其记录到控制台?您可以在异步迭代中登录,并保留最后的console.log调用来检查这一点。对于
async
循环使用本机for循环。它可能打印一个空数组,因为您正在将对象异步推送到数组中,因此登录到控制台太早?您可以在异步迭代中登录,并保留最后的console.log调用来检查这一点。