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

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;
}

关键修改点说明

  1. async/await语法:把函数声明为async,这样就能在内部用await等待每个Promise完成,让异步代码看起来像同步代码一样顺序执行
  2. 直接获取查询结果:用await拿到db.get()的实际返回值,而不是Promise对象
  3. 处理返回格式兼容:不同的SQLite封装库返回的查询结果格式可能有差异,这里做了兼容处理,确保能正确提取count数值
  4. 调用方式调整:因为是async函数,它本身会返回一个Promise,调用时需要用await或者.then()来获取结果,比如:
    // 调用示例
    const exists = await this.checkIfBookmarkAlreadyExist("123");
    if(exists) {
      // 书签已存在的业务逻辑
    }
    

内容的提问来源于stack exchange,提问作者pjoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:57:46