Javascript 在循环之后运行函数

Javascript 在循环之后运行函数,javascript,node.js,callback,Javascript,Node.js,Callback,我希望在for循环完成循环之后运行函数,但在我的例子中,for循环之后的函数甚至在循环完成之前运行。 这是我的密码 let orderedItems = []; for (let i = 0; i < orderCode.length; i++) { menuModel.findOne({ _id: orderCode[i] }, (err, order) => { if (order) { orderedItems.push(order.nam

我希望在for循环完成循环之后运行函数,但在我的例子中,for循环之后的函数甚至在循环完成之前运行。 这是我的密码

let orderedItems = [];

for (let i = 0; i < orderCode.length; i++) {
  menuModel.findOne({
    _id: orderCode[i]
  }, (err, order) => {
    if (order) {
      orderedItems.push(order.name);
    }
  });
}

console.log(orderedItems); // all the tasks below run before the loop finished looping

let orderData = new orderModel();
orderData._id = helpers.createRandomString(5).toUpperCase();
orderData.username = username;
orderData.orderCode = orderCode;
orderData.orderedItems = orderedItems;
orderData.totalPrice = 5;

orderData.save((err) => {
  if (err) {
    console.log(err);
    callback(500, {
      'Error': '1'
    });
  }
  callback(200, {
    'Message': 'Successfully ordered'
  });
});   
让orderedItems=[];
for(设i=0;i{
如果(订单){
orderedItems.push(order.name);
}
});
}
console.log(orderedItems);//以下所有任务在循环完成循环之前运行
让orderData=new orderModel();
orderData._id=helpers.createRandomString(5.toUpperCase();
orderData.username=用户名;
orderData.orderCode=orderCode;
orderData.orderedItems=orderedItems;
orderData.totalPrice=5;
orderData.save((错误)=>{
如果(错误){
控制台日志(err);
回调(500{
“错误”:“1”
});
}
回调(200{
“消息”:“已成功订购”
});
});   

正如@RishikeshDhokare所说,一切都是异步执行的。因此,诀窍是将任务拆分为单独的函数

因此,首先我们执行一个异步函数,您可以使用Promissions或AsyncWait

然后我们说,在所有异步任务完成后,执行保存任务

const orderCode=[1,2,3]
常量菜单模型={
findOne:item=>newpromise(resolve=>resolve({
_id:item.\u id,
姓名:“姓名”
}))
}
类顺序模型{
保存(cb){
返回cb(空)
}
}
/*
忽略以上所有我在嘲笑你的功能
和变量,以便代码正常工作
*/
让orderedItems=[];
函数getAllOrderedItems(){
const promises=orderCode.map(id=>{
返回菜单model.findOne({
_id:id
});
})
console.log(“…启动请求”)
//激发所有异步项,然后立即解析它们
回报承诺。全部(承诺)
。然后((数据)=>{
console.log(“…已完成所有请求”)
退货订单editems.concat(数据);
})
.catch(err=>console.log(err))
}
函数handleSave(数据){
让orderData=new orderModel();
console.log(数据)
console.log(“…开始保存”)
orderData.save((错误)=>{
console.log(“…保存完成”)
});
}
//执行所有异步任务,然后执行保存任务
getAllOrderedItems()

。然后((数据)=>handleSave(数据))
,因为所有操作都是异步执行的。您可以将for循环包装在一个promise中,完成后,您可以执行代码的其余部分(可能重复)