Can';forEach循环JavaScript外部的t access变量

Can';forEach循环JavaScript外部的t access变量,javascript,express,variables,foreach,Javascript,Express,Variables,Foreach,我想获取函数外部的allItems变量,但我只能得到一个空数组。第一个console.log显示了我想要的数组,但第二个只是[] var allItems = []; orderPads.forEach(async element => { element.orders_fk.forEach(async elem => { let itemsArray = await OrderedItem

我想获取函数外部的allItems变量,但我只能得到一个空数组。第一个console.log显示了我想要的数组,但第二个只是[]

var allItems = [];    
orderPads.forEach(async  element => {
        
        element.orders_fk.forEach(async elem => {
            
            let itemsArray = await OrderedItem.find({ order_fk: elem });
            
            
            itemsArray.forEach(async e => {
                 
                let temp = e.toObject();
                const mesa = await Table.findById(element.mesa);
                temp.mesa = mesa.name;
                
                allItems.push(temp)
                console.log(allItems)
                
            })
        })
    });
console.log(allItems)

我已经在网上找到了答案,但在这种情况下似乎什么都不起作用。谢谢你的帮助

异步函数不会执行您认为它们在
forEach
中执行的操作。Foreach将等待每个循环,但由于它不会返回
承诺
,因此实际上不能等待所有循环(Foreach)完成-该方法将立即返回当前空值。然后你记录一次。您可能会注意到,您的最后一个日志是先记录的,其他日志是后记录的,这表明
forEach
已完成,但循环是在稍后完成的,并且您的数组仅在第一个日志之后才填充

就个人而言,我建议改为使用
for
循环本身,这实际上不会使您脱离异步流:

const allItems=[];
for(订单的常量元素){
for(元素的常量。顺序){
const itemsArray=await OrderedItem.find({order_fk:elem});
用于(项目的常数){
const temp=e.toObject();
const mesa=wait Table.findById(element.mesa);
temp.mesa=mesa.name;
所有项目推送(温度)
console.log(allItems)
}
}}

console.log(allItems)
Async和forEach不能一起工作。使用
asyncForEach
或使用简单的
进行
循环。
.forEach()
不会等待每个循环。它不知道承诺,对回调返回的内容不关心。它不会等待异步函数解析其承诺。您建议切换到
for
循环的建议是正确的
.forEach()
现在基本上应该停止使用,因为
for
循环现在功能强大得多,编译器可以更好地优化它,它将等待
等待
,并通过
继续、中断、返回
等进行流控制
.forEach()
将无法完成所有这些。非常感谢您在此处和@jfriend00给出的答案!我不仅解决了我的问题,而且学到了很多。希望你们今天过得愉快!美好的很乐意帮忙,祝你好运!异步似乎很复杂,但请记住,您要等待的一切都需要异步,否则您将看到意外的行为@jfriend00不要忘记循环的
标签
——当您开始嵌套
for
循环时,它是非常有用的(在这个问题中就是这样)<代码>myLabelLoop:for(集合的常量)break myLabelLoop。太有用了。很容易控制。在99%的情况下,我已经停止使用
forEach