асинхронный и ожидающий в массиве многих объектов, т.е. более 1000 - PullRequest
1 голос
/ 31 марта 2019

У меня есть более 1000 массив объектов с такими свойствами, как:

const empArr = [{ empName: 'sds', empId: 'e3', dob: '22 -12-2 ', .. скоро }];

Я пробовал формулировать проблему с помощью promise.all (обещания), но я хочу сделать это более эффективно. Итак, мне нужна помощь

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 объектов в массиве. Здесь я выбираю emp age из db, который возвращает мне обещание, содержащее emp id. Я использую обещание. Все, чтобы сделать эту работу, вместо этого есть ли лучший способ обойтись без использования обещания и затем итерации? Заранее спасибо.

Примечание: пожалуйста, игнорируйте синтаксические ошибки в коде. Моя цель здесь просто описать мою постановку проблемы.

1 Ответ

1 голос
/ 31 марта 2019

У меня есть решение, т.е. один цикл выполняет все, например, с использованием IIFE, асинхронного ожидания, без обещания. Все и повторения ответа на обещания.

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 
});
})();
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...