回调函数内无法修改外部变量dbResult?求JavaScript技术解答
问题原因及解决方案
核心问题:回调模式与Promise模式混用导致异步执行顺序错误
你这里的问题出在pool.query的两种调用模式冲突了:
- 当你给
pool.query传递回调函数时,它会切换到传统的回调异步模式,此时await根本不会等待回调执行完成——因为回调是在后续的事件循环里触发的,await结束后直接执行console.log(dbResult),这时候回调里的赋值逻辑还没跑,所以dbResult还是初始的undefined。 - 大多数数据库连接池(比如pg的
pool)的query方法规则是:不传回调返回Promise,传回调则走回调流程,不返回可等待的有效Promise,你同时用await和回调,相当于把两种异步模式混在一起,逻辑顺序完全乱了。
解决方案(推荐用Promise+async/await写法)
直接去掉回调,用await接收query返回的Promise结果,这样就能保证赋值完成后再执行console.log:
let dbResult // insert marker into db dbResult = await pool.query( 'INSERT INTO markers (title, description, creator, active) VALUES ($1, $2, $3, $4) RETURNING *', [title, description, creator, active] ); console.log(dbResult)
备选方案(如果非要用回调)
把console.log放到回调函数内部,或者用Promise包装回调逻辑,确保在回调执行后再读取变量:
let dbResult // insert marker into db pool.query( 'INSERT INTO markers (title, description, creator, active) VALUES ($1, $2, $3, $4) RETURNING *', [title, description, creator, active], (error, results) => { if (error) { throw error } dbResult = results; console.log(dbResult) // 只有这里能保证拿到赋值后的值 });
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

