NativeScript SQLite返回值无法访问,TypeScript函数始终返回false求助
解决TypeScript+NativeScript中SQLite异步查询导致的返回值错误问题
嘿,我完全懂你碰到的这个坑——这是异步操作没处理到位导致的典型问题!你的代码里SQLite的操作都是异步返回Promise的,但你却在同步逻辑里直接去访问结果,这时候异步查询还没完成,自然拿不到正确的count值,函数也就一直返回false了。
原代码的问题分析
咱们拆解下你代码里的核心问题:
new Sqlite("sts.db")和db.get(...)都是异步操作,返回的是Promise对象,不是直接的查询结果- 你用
.then()链式调用时,this.countInDb被赋值成了db.get().then(...)返回的Promise,而非实际的count数值 - 后面的
console.log和if(this.countInDb>1)是同步执行的,这时候异步查询还没跑完,this.countInDb要么是初始的0,要么是一个Promise对象,根本没法和数字1做有效比较
修正后的代码方案
把函数改成async函数,用await来等待异步操作完成,这样就能按顺序拿到实际的查询结果了:
async checkIfBookmarkAlreadyExist(study_number: string): Promise<boolean> { // 等待数据库实例初始化完成 const db = await new Sqlite("sts.db"); // 等待查询结果,row里就是count(*)的返回值 const row = await db.get("SELECT count(*) FROM bookmarks WHERE study_number= ?", [study_number]); // 兼容不同SQLite库的返回格式:有的返回对象(键为列名),有的返回数组 const count = typeof row === 'object' ? row['count(*)'] || row[0] : row; console.log("value of countInDb: ", count); // 根据count值返回判断结果 return count >= 1; }
关键修改点说明
- async/await语法:把函数声明为
async,这样就能在内部用await等待每个Promise完成,让异步代码看起来像同步代码一样顺序执行 - 直接获取查询结果:用
await拿到db.get()的实际返回值,而不是Promise对象 - 处理返回格式兼容:不同的SQLite封装库返回的查询结果格式可能有差异,这里做了兼容处理,确保能正确提取count数值
- 调用方式调整:因为是async函数,它本身会返回一个Promise,调用时需要用
await或者.then()来获取结果,比如:// 调用示例 const exists = await this.checkIfBookmarkAlreadyExist("123"); if(exists) { // 书签已存在的业务逻辑 }
内容的提问来源于stack exchange,提问作者pjoe
相关产品推荐
相关产品推荐

