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

Ionic中调用myService的getNameFromDB()未返回Promise问题

问题:Promise已调用resolve但外部then/catch无响应

myService中的getNameFromDB()方法返回Promise,调用时控制台能打印Name is set? true,说明方法已执行且调用了resolve('success'),但home.page.ts中then和catch的三个日志均未输出。

相关代码

myService.ts

public getNameFromDB(){
    return new Promise((resolve, reject) => {
        let param = {
          table: "info",
          columns: "*",
          where: "id=1"
        };
        this.dbService.select(param).then(
          (res: []) => {
            if (res.length != 0) 
              if (res[0]['name'] != '')
                this.nameIsSet = true;
              
            console.log('Name is set? ', this.nameIsSet);
            resolve('success');
          },
          (err) => {
            console.error('Error while reading info: ', err);
            reject(err);
          }
        ).catch(e => {
        console.error('[myService.ts] catch error: ' + e);
        reject(err); // 这里的err未定义,会抛出ReferenceError
    });
    }) // close promise
  } //close function

home.page.ts

this.myService.getNameFromDB().then(
   (res)=>{ console.log('1. Name is set.')},
   (err)=>{ console.log('2. Some error.')}      
 )
 .catch(e => {
    console.error('3. catch error: ' + e);
  });

问题排查与修复

  1. 修复未定义变量错误
    在myService.ts的catch块中,你使用了未定义的err变量,正确参数应为e。这个错误会导致Promise构造函数内部抛出ReferenceError,打乱Promise的状态决议流程:

    .catch(e => {
      console.error('[myService.ts] catch error: ' + e);
      reject(e); // 将err改为e
    });
    
  2. 移除Promise构造函数反模式
    你用new Promise包裹了已有的Promise(this.dbService.select返回的Promise),这是典型的Promise反模式,容易导致状态处理混乱。直接返回内部Promise链即可:

    public getNameFromDB() {
      let param = {
        table: "info",
        columns: "*",
        where: "id=1"
      };
      return this.dbService.select(param).then((res: []) => {
        // 简化条件判断写法
        if (res.length !== 0 && res[0]['name'] !== '') {
          this.nameIsSet = true;
        }
        console.log('Name is set? ', this.nameIsSet);
        return 'success'; // 用return替代resolve
      }).catch(err => {
        console.error('Error while reading info: ', err);
        throw err; // 用throw替代reject,将错误传递到外部
      });
    }
    
  3. 验证调用时机与实例正确性
    确保home.page.ts中this.myService已正确注入(Angular中需在构造函数声明并在模块中提供服务),且调用getNameFromDB()的代码处于会被执行的逻辑分支中(比如放在ngOnInit生命周期钩子内)。

验证修复

修复后,当getNameFromDB()执行完成并resolve时,home.page.ts中的then回调会正常打印1. Name is set.;若出现错误,catch回调会打印对应错误日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:49:58