【发布时间】:2020-06-01 10:04:40
【问题描述】:
let data = {};
sql.query("SELECT * FROM courses WHERE name = ?", [name], function(err, course) {
if (err) result(null, err);
else {
data.id = course[0].id;
data.course = course[0].name;
data.terms = []
sql.query("SELECT * FROM terms WHERE course_id = ?", [course[0].id], function(err, term) {
if (err) result(null, err);
else {
for (let i = 0; i < term.length; i++) {
data.terms.push({
id: term[i].id,
name: term[i].name,
modules: []
});
sql.query("SELECT * FROM modules WHERE term_id = ?", [term[i].id], function(err, module) {
if (err) result(null, err);
else {
for (let j = 0; j < module.length; j++) {
data.terms[i].modules.push({
id: module[j].id,
name: module[j].name,
topics: []
});
sql.query("SELECT * FROM topics WHERE module_id = ?", [module[j].id], function(err, topic) {
if (err) result(null, err);
else {
for (let k = 0; k < topic.length; k++) {
data.terms[i].modules[j].topics.push({
id: topic[k].id,
name: topic[k].name
});
}
if (i === term.length - 1) result(null, data);
}
});
}
}
});
}
}
});
}
});
【问题讨论】:
-
知道箭头函数,用
(//arguments ) => { //function body }替换所有函数,即function (){} -
我已经这样做了,但什么也没发生。
-
很遗憾地告诉你,这是一个经典的“回调地狱”例子,所有的异步操作都应该转换成 Promise,然后整个事情可以用 Promise 写得更干净,
.then()/.catch()和async/await。但是,第一步是将所有异步操作转换为使用 Promise,然后您可以使用 Promise 控制流来管理异步流。仅供参考,有一个不同版本的 mysql 内置了承诺支持。 -
你能这样写吗,因为当我试图这样做时,我在索引时感到困惑。如您所见,我在插入数据时使用了特定的数组位置。
-
关于
for循环内的异步 node.js 函数有很多 Stack Overflow 问题。您研究并尝试了其中的哪些,为什么它们没有解决您的特定问题?
标签: node.js