Node.js 我的承诺有什么问题,异步/等待函数都返回空数组

Node.js 我的承诺有什么问题,异步/等待函数都返回空数组,node.js,promise,async-await,Node.js,Promise,Async Await,我的代码中有一个对象数组,如下所示 [ { name: 'JMCP', priority: 1 }, { name: 'OTC', priority: 2 }, { name: 'CMT', priority: 3 }, { name: 'SMPP', priority: 4 }, { name: 'CDRBilling', priority: 5 }, { name: 'Colgate', priority: 6 }, { name: 'FFM', priority:

我的代码中有一个对象数组,如下所示

[ { name: 'JMCP', priority: 1 },
  { name: 'OTC', priority: 2 },
  { name: 'CMT', priority: 3 },
  { name: 'SMPP', priority: 4 },
  { name: 'CDRBilling', priority: 5 },
  { name: 'Colgate', priority: 6 },
  { name: 'FFM', priority: 7 },
  { name: 'PBX', priority: 8 },
  { name: 'BeepCall', priority: 9 },
  { name: 'MWIFI', priority: 10 },
  { name: 'PoolData', priority: 11 } ]
我想做的是更新我的mongodb数据库中的每个对象名称和优先级属性,这很好。我面临的问题是,当我尝试在数组中存储每个对象的名称时,它总是空的 下面是我的代码

 async function abc(arrofObjects)
 {
 var new_prod=new Array();
 arrofObjects.forEach(async (ele)=>{
 await ProductsModel.update({name:ele.name}, {"$set":{"priority": ele.priority}});
 // Up till Here everything is working fine all records are being updated accordingly
 // the issue arises here
 new_prod.push(ele.name); 
 })
 console.log(new_prod); //Here its always empty
 return new_prod;
 }
我也尝试过通过承诺来实现,但都是徒劳的

getFinalArr(arrofObjects).then(console.log)// logs empty array
getFinalArr(arr){
  var finalArr=new Array();
  return new Promise((resolve)=>{
  arr.forEach(async (item)=>{
  await ProductsModel.update({name:item.name}, {"$set":{"priority": item.priority}});
   // Up till Here everything is working fine all records are being updated accordingly
  // the issue arises here
  await finalArr.push(await item.name);
});
console.log(finalArr);//always empty
resolve(finalArr);
})
}
forEach()
是异步的,因此
new\u prod
将在填充之前返回

您应该尝试以下方法:

async function abc(arrofObjects)
{
 var new_prod=new Array();
 for (var index = 0; index < arrofObjects.length; index++) {
    var ele = arrofObjects[index];
    await ProductsModel.update({name:ele.name}, {"$set":{"priority": ele.priority}});
    new_prod.push(ele.name);
 }
 console.log(new_prod);
 return new_prod;
}
异步函数abc(arrofObjects) { var new_prod=new Array(); 对于(var index=0;index您还可以使用for of

for (let ele of arrofObjects) {
    await ProductsModel.update({name:item.name}, {"$set":{"priority": item.priority}});
    // Up till Here everything is working fine all records are being updated accordingly
    finalArr.push(item.name);
}
此解决方案的局限性在于update()调用都是按顺序进行的,这可能比您希望的要慢。但它也有一个优点,即不是所有的请求都会同时发出,从而淹没服务器

如果列表足够小,扇出不会杀死你,我会将它映射到一系列承诺中,然后等待结果:

let promises = arrofObjects.map((ele) => ProductsModel.update(...));
let new_prod = await Promise.all(promises);
当然,它总是从很小的地方开始,然后当你忙于寻找其他东西时,它会慢慢上升…

为什么异步函数abc(arrofObjects)上有一个异步函数?唯一的异步应该在lambda中。也许这就是让运输员困惑的地方