调用JS异步Promise函数后变量值异常求助(Cordova SQLite)
问题解决:Cordova SQLite异步统计记录数后变量值不正确
问题原因
你的代码核心问题是异步操作的时序问题:
howManyRecords是异步函数,但你调用时没有等待它执行完成就直接读取全局变量records,此时异步操作还没完成,records还是初始值-1。- 原函数通过修改全局变量传递结果的方式本身不可靠,异步操作的结果应该通过 Promise 直接返回,而非依赖全局状态。
修正方案
1. 重构统计函数,直接返回结果
修改 howManyRecords,让它通过 Promise 直接返回统计到的记录数,不再依赖全局变量:
async function howManyRecords() { return new Promise(function (resolve) { DB.transaction(function (tx) { tx.executeSql('SELECT count(*) AS mycount FROM DemoTable', [], function (tx, rs) { // 直接把统计结果传给resolve resolve(rs.rows.item(0).mycount); }); }); }); }
2. 调用时等待异步操作完成
在 onDeviceReady 的回调中,需要等待 howManyRecords 执行完成后再读取结果,有两种实现方式:
方式一:使用 await(推荐)
把回调函数改成 async,用 await 等待异步函数返回结果:
onDeviceReady.then(async function () { const records = await howManyRecords(); console.log("after calling function records are: " + records); });
方式二:使用 .then()
如果不想用 async/await,可以通过 Promise 的 .then() 方法处理结果:
onDeviceReady.then(function () { howManyRecords().then(function(records) { console.log("after calling function records are: " + records); }); });
关键说明
- 异步操作(比如数据库查询)不会阻塞代码执行,必须通过
await或.then()等待结果返回后再进行后续操作。 - 尽量避免用全局变量传递异步结果,这种方式极易因时序问题导致错误,直接通过 Promise 返回结果是更规范、可靠的做法。
内容的提问来源于stack exchange,提问作者m1212
相关产品推荐
相关产品推荐

