带有动态参数的一堆查询



首先,我从 mysql query

获得了一些 instructions

获取指令

function getAllInstructions(req,res){
    let mysqlQuery = `SELECT * FROM instructions where id = '` + req.params.id + "'";
    connection.query(mysqlQuery, function(err, rows, fields) {
    if (!err) {
        var instructions = new Array(); // <-- Getting my instructions there
        for (var i=0; i<rows.length;i++) {
             var instruction = new Instruction();
             instruction.id = rows[i].id;
             instruction.title = rows[i].title;
             instructions.push(instruction);
        }
    }
    else {
        console.log('Error while performing Query.');
    } 
});}

每个指令都有自己的steps。在完成指示后,我需要为我获得的每个说明获得一系列steps

函数正在获取thoose steps

function getStepsForInstruction(_instructionId){
    let mysqlQuery = `SELECT * FROM steps where steps.instruction_id =  '` + _instructionId + "'";
    var steps = [];
    connection.query(mysqlQuery, function(err, rows, fields) {
    if (!err) {
        var steps = [];
        for (var i=0; i<rows.length; i++) {
            var step = new Step();
            step.id = rows[i].id;
            step.title = rows[i].title;
            steps.push(step);
        }
    }
    else {
        console.log('Error while performing Query.');
    }
});}

所以我想做这样的事情

for (var i=0;i<instructions.length;i++) {
     instructions[i].steps = getStepsForInstruction(instructions[i].id);
}

我该如何使用async或常见?

如果让 getAllInstructions继续返回指令而不步骤,我会更改这些功能,以便它们返回承诺(并使用正确的参数逃脱,以及其他几个次要事物,例如[]而不是new ArrayArray#map):

function getAllInstructions(req, res) {
    return new Promise(function(resolve, reject) {
        connection.query('SELECT * FROM instructions where id = ?', [req.params.id], function(err, rows, fields) {
            if (err) {
                reject(err);
            } else {
                var instructions = rows.map(function(row) {
                    var instruction = new Instruction();
                    instruction.id = row.id;
                    instruction.title = row.title;
                    return instruction;
                });
                resolve(instructions);
            }
        });
    });
}
function getStepsForInstruction(_instructionId) {
    return new Promise(function(resolve, reject) {
        connection.query('SELECT * FROM steps where steps.instruction_id = ?', [_instructionId], function(err, rows, fields) {
            if (err) {
                reject(err);
            } else {
                var steps = rows.map(function(row) {
                    var step = new Step();
                    step.id = row.id;
                    step.title = row.title;
                    return step;
                });
                resolve(steps);
            }
        });
    });
}

...然后使用Promise.all

getAllInstructions(req, res).then(function(instructions) {
    return Promise.all(instructions.map(function(instruction) {
        return getStepsForInstruction(instruction.id).then(function(steps) {
            instruction.steps = steps;
            return instruction;
        });
    });
}).then(function(instructions) {
    // They're all done, render them here
});

,但理想情况下,getAllInstructions将为我们填写步骤,这简化了事物:

function getAllInstructions(req, res) {
    return new Promise(function(resolve, reject) {
        connection.query('SELECT * FROM instructions where id = ?', [req.params.id], function(err, rows, fields) {
            if (err) {
                reject(err);
            } else {
                var instructionPromises = rows.map(function(row) {
                    var instruction = new Instruction();
                    instruction.id = row.id;
                    instruction.title = row.title;
                    return getStepsForInstruction(instruction.id).then(function(steps) {
                        instruction.steps = steps;
                        return instruction;
                    });
                });
                resolve(Promise.all(instructionPromises));
            }
        });
    });
}
// (getStepsForInstruction is like my earlier one)
// Usage:
getAllInstructions(req, res).then(function(instructions) {
    // They're all done, render them here
});

请注意,在上面,我已经手动处理了查询的承诺,但是有一些库可以用来" promissify"标准节点式回调API,因此您不必手动执行此操作。(搜索应该为此输入一些选项。)

最新更新