You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:33:16