在数据库查询时处理节点的非阻塞性

vmdwslir  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(377)

我创建了一个函数,它包含一组雇员。我需要找出mysql中不同表中每个雇员的教育细节,并将其附加到特定的employee对象。
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数组,并将每个employee对象推入其中。为了存储教育细节,我创建了employee['education']。这个问题是由于nodejs的非阻塞i/o技术引起的。
node并不等待mysql查询完成,因此甚至在将教育细节插入其中之前就返回emparr。
我正在想办法解决这个问题。

owfi6suc

owfi6suc1#

你可能想用 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);
            }
        });
    });
}

相关问题