JavaScript提取SQL Server数据存变量异常及HTML展示问题
问题分析与解决
你遇到的是JavaScript异步执行的特性问题,不是代码逻辑错误,执行顺序和你预期不符的原因是:
connectStart()调用后,内部的poolConnect.then()和request.query()都是异步任务,JavaScript会把这类任务放到事件队列中,优先执行主线程里的同步代码——也就是最后一行的console.log(workid),此时异步任务还没完成,workid自然是空数组。- 等主线程同步代码执行完毕,才会处理事件队列里的异步任务,这时数据库连接、查询才完成,
workid被填充,所以你会看到后面的console.log(workid)才有数据。
修正后的代码(用async/await简化异步逻辑)
推荐用async/await重构代码,逻辑更直观,避免回调嵌套:
const pool = new sql.ConnectionPool(config); let workid = []; async function connectStart() { try { // 等待连接池建立连接 await pool.connect(); const request = new sql.Request(pool); // 用await接收查询结果(mssql的query支持Promise) const result = await request.query(` select * from dbo.xxAIO_det where xxAIO__ch01 like '%172.168.1.70;%' order by xxAIO_NO `); console.log("Results:"); workid = result.recordset.map(row => row.xxAIO_NO); console.log(workid); // 直接调用渲染表格的函数,确保数据就绪后再渲染 renderTable(workid); } catch (err) { console.error("ERROR", err); } finally { // 无论成功失败都关闭连接池,避免资源泄漏 await pool.close(); } } // 渲染HTML表格的函数 function renderTable(data) { const table = document.getElementById("your-table-id"); // 替换为你的表格ID const tbody = table.querySelector("tbody") || document.createElement("tbody"); data.forEach(id => { const row = document.createElement("tr"); const cell = document.createElement("td"); cell.textContent = id; row.appendChild(cell); tbody.appendChild(row); }); table.appendChild(tbody); } // 执行连接查询 connectStart();
关键注意点
- 所有依赖数据库数据的逻辑(比如渲染表格)必须放在异步任务完成后执行,要么在
await之后,要么在回调函数内部,不能直接放在异步函数外部。 mssql库的query方法支持返回Promise,用await替代回调能大幅提升代码可读性和可维护性。- 用
try/catch/finally处理异常,确保连接池始终会被关闭,避免资源浪费。
内容的提问来源于stack exchange,提问作者JJJason
相关产品推荐
相关产品推荐

