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

时间:2019-03-31 10:35:54

标签: javascript node.js cassandra

我具有这些属性的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然后进行迭代呢?预先感谢。

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

1 个答案:

答案 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 
});
})();
}