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;indexfor (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中。也许这就是让运输员困惑的地方