Node.js中执行sqlite查询后外部JavaScript变量未修改如何解决?
问题原因
该问题是Node.js的异步非阻塞IO特性导致的:conn.each 是异步数据库操作方法,调用后不会等待SQL查询和遍历逻辑执行完成,就会立即往后执行后续代码。因此你写在conn.each后面的console.log(n)实际运行时间早于回调内的变量赋值逻辑,此时n还未被修改,输出的还是初始值。
解决方法
- 方案1:使用操作完成回调处理后续逻辑
你所用的sqlite库的conn.each方法支持传入第三个参数,即所有行遍历完成后的回调函数,所有需要用到修改后n值的逻辑都可以放到这个回调中执行:
const conn = new ConnectionFactory().connection; let n = "Jhon"; conn.each("SELECT * FROM pilots", (err, row) => { n = row.name; console.log(n); console.log("--------") }, () => { // 所有数据遍历完成后才会执行此处 console.log("--------") console.log(n); });
- 方案2:封装为Promise配合async/await使用
如果后续逻辑较多,嵌套回调可读性较差,可以把查询逻辑封装为Promise,用async/await语法让代码按同步顺序执行:
const conn = new ConnectionFactory().connection; function getPilotName() { return new Promise((resolve, reject) => { let n = "Jhon"; conn.each("SELECT * FROM pilots", (err, row) => { if (err) return reject(err); n = row.name; console.log(n); console.log("--------") }, () => { resolve(n); }); }); } async function main() { const n = await getPilotName(); console.log("--------") console.log(n); // 后续所有用到n的逻辑都可以在这里按顺序写 } main();
内容的提问来源于stack exchange,提问作者João Victor
相关产品推荐
相关产品推荐

