异步并等待许多对象的数组,即超过1000

问题描述 投票:1回答:1

我有超过1000个这些属性的对象数组,如:

const empArr = [{empName:'sds',empId:'e3',dob:'22 -12-2',.. so so}};

我已经尝试使用promise.all(promises)来解决问题,但我想更高效地完成它。所以,我需要一些帮助

function makeDBInsert(empArr) {
const dbArr = [];
const promises = [];
const LEN = empArr.length;

/** this function returns promise containing emp age **/
function getEmpAge(empId) {
return db.execute('select age from emp where "empId" = ?', [empId]);
} 

for (let i = 0; i < LEN; i += 1) {
const obj = {
name: empArr[i].empName, 
empId: empArr[i].empId
}
promises.push(getEmpAge(obj.empId);
dbArr.push(obj);
}

return Promise.all(promises).then((empDetail) => {
const dbObj = empDetail.map((emp, i) => {
return {
dbArr[i].age: emp.age
}
});
return db.insert('insert into emp ("name", "id", "age") values ('?', '?', '?');', Object.values(obj));
}).catch(err => console.error(err));
} 

所以,这里empArr在数组中有超过1000个对象。在这里,我从db获取emp age,返回包含emp id的promise。我正在使用promise.all来完成这项工作,而没有更好的方法在不使用promise.all然后迭代的情况下做什么?提前致谢。

注意:请忽略代码中的语法错误。我的目的只是描述我的问题陈述。

javascript node.js cassandra
1个回答
1
投票

我得到了解决方案,即一个循环做所有事情,如使用IIFE,异步等待,没有promise.all并迭代promises响应。

async function makeDBInsert(empArr) {
const modifiedArr = [];

function getEmpAge(empId) {
return db.execute('select age from emp where "empId" = ?', [empId]);
} 


await (function doDBCalls() {
empArr.forEach(async (item, i) => {
 /* getEmpAge(param) is DB call */
    const res = await getEmpAge(item.empId);
    modifiedArr.push({modified: res.age });
    // modify the object here and batch insert 
});
})();
} 
© www.soinside.com 2019 - 2024. All rights reserved.