Обработка неблокирующей природы узла во время запросов к базе данных - PullRequest
0 голосов
/ 09 мая 2018

Я создал функцию, которая принимает массив сотрудников.Мне нужно выяснить детали образования каждого сотрудника, которые находятся в другой таблице в mysql, и прикрепить их к конкретному объекту Employee.

Вот как выглядит объект сотрудника:

 employee: {
    id: 1,
    name: 'John'
 }

Вот функция, которую я написал:

const getEducationDetails = (employees, done) => {
        var empArr = [];

        employees.forEach(employee => {
            empArr.push(employee);
            employee.education = [];

            const sql = `SELECT * FROM employee_education_details 
                        WHERE employee_id = "${employee.id}"`

                db.query(sql, (err, educationDetails, fields) => {

                employee.education.push(educationDetails);

            });        

        });

    return done(empArr);
}

Итак, я создал собственный массив empArr и вставил в него каждый объект сотрудника.Чтобы сохранить детали образования, я создал сотрудника ['образование'].Проблема возникает из-за неблокирующей техники ввода / вывода nodejs.

Узел не ожидает завершения запроса mysql и, следовательно, возвращает empArr даже до вставки в него сведений об образовании.

Я пытаюсь найти лучший способ решить эту проблему здесь.

1 Ответ

0 голосов
/ 09 мая 2018

Возможно, вы захотите использовать Promises. Вы можете сделать это, используя promises, как показано ниже:

const getEducationDetails = (employees, done) => {
    var empPromArr = [];
    employees.forEach(employee => {
        let p = new Promise((resolve, reject) => {
            empArr.push(employee);
            employee.education = [];
            let empEduPromises = [];
            empEduPromises.push(query(employee));
            Promise.all(empEduPromises).then(educationDetails => {
                employee.education = educationDetails;
                resolve(employee)
            }, err => {
                reject(err);
            });
        });
        empPromArr.push(p);
    });
    Promise.all(empPromArr).then(empArr => {
        return done(empArr);
    }, err => {
        //error handling
    });
}

function query(employee) {
    return new Promise((resolve, reject) => {
        const sql = `SELECT * FROM employee_education_details 
    WHERE employee_id = "${employee.id}"`
        db.query(sql, (err, educationDetails, fields) => {
            if (err) {
                reject(err);
            }
            else {
                resolve(educationDetails);
            }
        });
    });
}
...