我有超过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然后迭代的情况下做什么?提前致谢。
注意:请忽略代码中的语法错误。我的目的只是描述我的问题陈述。
我得到了解决方案,即一个循环做所有事情,如使用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
});
})();
}