我具有这些属性的1000多个对象数组,例如:
const empArr = [{ empName:“ sds”, empId:“ e3”, dob:“ 22-12-2”, ..等等 }];
我已经尝试过使用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.all来完成这项工作,相反,有什么更好的方法可以不使用promise.all然后进行迭代呢?预先感谢。
注意:请忽略代码中的语法错误。我的目的仅仅是描述我的问题陈述。
答案 0 :(得分: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
});
})();
}