我已经尝试了几天,但是似乎无法正常工作。

我有一个如下所示的MySQL表:

    empName empID empManagerID
    -------------------------------------------------- ----------
    亚历克斯经理125354 987654
    简·多伊223535 125354
    弗洛伊德·古兹曼654354 125354

    艾玛·弗莱彻325150 212335
    托尼·科普兰456842 325150
    本杰明·普拉特(Benjamin Pratt)231543 325150
    卡桑德拉·加德纳656560 325150


    弗雷德里克·布罗格顿783487 239873
    迪安格洛·格兰顿823402 783487
    杰拉尔丁·布拉* 230123 783487
    Jayna Lemmond 182739 783487
    夏季Wirtz 849734 783487
    克莱雷莎·谢弗983787 783487


    Tanna Boelter 345623 * 230123
    查尔塞塔·德博特923476 230123
    迈克尔·古因456782 230123
    多米尼克·皮拉伊诺(Dominick Piraino)956235 125354
    Shavonne Ovellette 108934 125354



通过提供经理的employeeID作为起点,我希望能够找到所有报告给特定managerID的人员姓名。

例如:

Select * from tableName where empManagerID = '125354';

这应该返回:

简·多伊223535 125354
弗洛伊德·古兹曼654354 125354
多米尼克·皮拉伊诺(Dominick Piraino)956235 125354
Shavonne Ovellette 108934 125354


然后,我需要获取结果的每个empID,并使用empID作为empManagerID创建多个查询,以找到向结果中的人员报告(如果有)的所有人员。

这需要一直进行到最终查询基本上为空为止。

在我的课程助教的帮助下,我取得了以下成就:

    函数getEmployees(employerID){
        const query =`
            选择empName,empID,empManagerID
            从myTable
            哪里empManagerID = $ {employerID}
        `;

      返回新的Promise((resolve,reject)=> {
            con.query(query,(err,rows,fields)=> {
                返回解析(行);
        });
      });
    }

    getEmployees(125354)
        .then((员工)=> {
            //将返回的结果推入某种数组。

            const empPromises = employee.map((e)=> {
                返回getEmployees(e.empID)
            });
        返回Promise.all(empPromises);
        })

        //将fs.writeFile导出到reports.json文件中,以备将来参考。


上面的代码有效,但是似乎没有递归地提取结果,我不知道为什么。实际表有成千上万的行,具有许多级别的员工=>经理=> sr经理关系

如果我尝试将另一个.then()与另一个对getEmployees的调用链接在一起,它只会返回一堆承诺-而不是结果。但是,如果我console.log(行),则可以看到结果。

我是JS的新手,仍然在学习...但是我无法弄清楚这一点。

任何帮助将不胜感激。

最佳答案

对于递归,您需要一个调用自身的函数(或以某种方式导致其自身被调用)。

并且在每次迭代中,您需要:


查找给定员工的下属(部分或全部)
返回下属列表加上每个下属的下属


由于递归,在下一级执行相同的操作,最终导致原始呼叫者最终收到所有下属,下属的下属,下属的下属等的列表。

// modified data, expressed as a javascript object-literal
var allEmployees = [
    { 'empName':'Alex Manager',       'empID':'125354', 'empManagerID':'987654' },
    { 'empName':'Jane Doe',           'empID':'223535', 'empManagerID':'125354' },
    { 'empName':'Floyd Guzman',       'empID':'654354', 'empManagerID':'125354' },
    { 'empName':'Irma Fletcher',      'empID':'325150', 'empManagerID':'125354' },
    { 'empName':'Toni Copeland',      'empID':'456842', 'empManagerID':'325150' },
    { 'empName':'Benjamin Pratt',     'empID':'231543', 'empManagerID':'325150' },
    { 'empName':'Cassandra Gardner',  'empID':'656560', 'empManagerID':'325150' },
    { 'empName':'Fredrick Brogdon',   'empID':'783487', 'empManagerID':'239873' },
    { 'empName':'Deangelo Glandon',   'empID':'823402', 'empManagerID':'783487' },
    { 'empName':'Geraldine Brar',     'empID':'230123', 'empManagerID':'231543' },
    { 'empName':'Jayna Lemmond',      'empID':'182739', 'empManagerID':'783487' },
    { 'empName':'Summer Wirtz',       'empID':'849734', 'empManagerID':'783487' },
    { 'empName':'Claretha Sheffer',   'empID':'983787', 'empManagerID':'783487' },
    { 'empName':'Tanna Boelter',      'empID':'345623', 'empManagerID':'230123' },
    { 'empName':'Charlesetta Debolt', 'empID':'923476', 'empManagerID':'230123' },
    { 'empName':'Michael Gouin',      'empID':'456782', 'empManagerID':'230123' },
    { 'empName':'Dominick Piraino',   'empID':'956235', 'empManagerID':'125354' },
    { 'empName':'Shavonne Ovellette', 'empID':'108934', 'empManagerID':'125354' }
];

// simple filter in place of SQL
function getEmployeesOf(employerID) {
    return Promise.resolve(allEmployees.filter(emp => emp.empManagerID === employerID));
}

// recursive function (it calls itself)
function drillDown(employerID) {
    return getEmployeesOf(employerID).then(employees => {
        let promises = employees.map(emp => drillDown(emp.empID));
        return Promise.all(promises).then(emps => employees.concat(...emps)); // spreading here avoids the need to flatmap later.
    });
}

drillDown('125354').then(results => {
    console.log('Results: ', results);
});


DEMO具有上面修改的数据,这应该给出12名员工的列表。

为了进行比较,如果一切都是同步的,这两个函数将是这样的:

function getEmployeesOf(employerID) {
    return allEmployees.filter(emp => emp.empManagerID === employerID);
}

function drillDown(employerID) {
    let employees = getEmployeesOf(employerID);
    return employees.concat(...employees.map(emp => drillDown(emp.empID)));
}


DEMO具有相同的修改数据

07-24 22:04