如何让代码按指定顺序执行?MySQL查询返回undefined问题求助
问题解决:异步MySQL查询结果无法正确获取
问题根源
Query.getDepartment方法无有效返回值:db.query是异步回调逻辑,回调函数里的return仅作用于回调内部,无法将查询结果传递给外部调用者,因此调用getDepartment()会直接得到undefined。- 原代码中
addRole调用时机错误:const声明的函数表达式不会被变量提升,原代码先调用addRole再定义函数,会导致调用时函数未定义(当前主要问题是departments为undefined,但这个问题也需同步修复)。
修复步骤
1. 修改query.js:将异步查询包装为Promise
把getDepartment改成返回Promise,让外部可以通过async/await等待异步结果:
class Query { getDepartment() { return new Promise((resolve, reject) => { db.query('SELECT name FROM department', (err, res) => { if (err) { // 传递错误信息,方便外部捕获处理 reject(err); return; } // 查询成功时返回结果 resolve(res); }); }); } }; // 导出Query类,供server.js引入使用 module.exports = Query;
2. 修改server.js:用async/await处理异步逻辑
调整代码顺序,用异步函数包裹操作,确保等待查询完成后再调用addRole:
const Query = require('./query.js'); // 引入Query类 // 先定义addRole函数,避免调用时未定义 const addRole = (departments) => { console.log(departments); }; // 用async函数处理异步流程 async function init() { const getDepartmentsQuery = new Query(); try { // await等待getDepartment的Promise完成,拿到查询结果 const departments = await getDepartmentsQuery.getDepartment(); addRole(departments); } catch (err) { // 捕获查询过程中的错误,避免程序崩溃 console.error('获取部门数据失败:', err); } } // 执行初始化逻辑 init();
关键说明
async/await必须配合Promise使用,因此将回调式的db.query包装成Promise是解决异步顺序问题的核心。- 所有依赖异步结果的操作都要放在
await之后,确保执行顺序符合预期。 - 必须捕获异步操作的错误,避免未处理的异常导致程序终止。
内容的提问来源于stack exchange,提问作者Frances Cortuna
相关产品推荐
相关产品推荐

