首先,我从 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 Array
,Array#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,因此您不必手动执行此操作。(搜索应该为此输入一些选项。)