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); });
问题排查与修复
修复未定义变量错误
在myService.ts的catch块中,你使用了未定义的err变量,正确参数应为e。这个错误会导致Promise构造函数内部抛出ReferenceError,打乱Promise的状态决议流程:.catch(e => { console.error('[myService.ts] catch error: ' + e); reject(e); // 将err改为e });移除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,将错误传递到外部 }); }验证调用时机与实例正确性
确保home.page.ts中this.myService已正确注入(Angular中需在构造函数声明并在模块中提供服务),且调用getNameFromDB()的代码处于会被执行的逻辑分支中(比如放在ngOnInit生命周期钩子内)。
验证修复
修复后,当getNameFromDB()执行完成并resolve时,home.page.ts中的then回调会正常打印1. Name is set.;若出现错误,catch回调会打印对应错误日志。
内容的提问来源于stack exchange,提问作者user6781
相关产品推荐
相关产品推荐

