Ionic中Async/Await无法正常工作问题求助(附代码)
问题排查与解决方案
从你的代码来看,核心问题出在**await 和 Observable.subscribe() 的混用**上,另外还有几个小细节需要修正,下面一步步帮你解决:
1. 核心问题:await 无法等待 subscribe 完成
await 只能等待 Promise 类型的对象,但 this.api.get(...) 返回的是一个 RxJS Observable,调用 .subscribe() 后返回的是 Subscription 对象,并不是 Promise,所以你的 await 根本起不到等待请求完成的作用,循环会直接继续执行,导致后续逻辑拿到的是未完成的数据。
解决方法:把 Observable 转为 Promise
在 RxJS 7 及以上版本,推荐用 firstValueFrom 或 lastValueFrom 把 Observable 转为 Promise;如果是旧版本可以用 toPromise()(已弃用,但仍能兼容)。这样 await 就能正确等待请求完成。
2. 其他需要修正的细节
- 循环里的
var会有变量提升和闭包问题,建议换成let; - 代码里的
undefine是拼写错误,应该是undefined; - 不需要在循环里反复初始化
bookingList和hblList(如果是每次循环都需要新数组的话,用let声明在循环内更清晰)。
修改后的完整代码示例
async getDetails() { // 把循环里的 var 换成 let,避免闭包问题 for(let i = 0; i < this.results.length; i++){ let hblList = []; let bookingList = []; // 用 firstValueFrom 把 Observable 转为 Promise,配合 await 等待请求完成 try { const res1 = await firstValueFrom( this.api.get("track/dtl", { loadPortId: this.results[i].loadPortId, dischargeId: this.results[i].dischargeId, scheduleId: this.results[i].scheduleId }) ); this.details = res1; bookingList.length = 0; hblList.length = 0; // 同样把 j 换成 let for(let j = 0; j < this.details.length; j++){ if(this.details[j].bookNo !== undefined){ bookingList.push(this.details[j].bookNo); } // 这里可以补充 hblList 的逻辑,你原代码里没写完,我就留空了 } // 后续可以用 bookingList 和 hblList 做其他操作 console.log('当前循环的bookingList:', bookingList); } catch (error) { // 别忘了捕获请求失败的情况 console.error('请求详情失败:', error); } } }
额外提示
- 如果你的 RxJS 版本低于 7,把
firstValueFrom换成.toPromise()即可,比如:const res1 = await this.api.get("track/dtl", { ... }).toPromise(); - 如果需要同时发起多个请求(而不是顺序执行),可以用
Promise.all()配合firstValueFrom,效率会更高,但要根据你的业务逻辑来选择。
内容的提问来源于stack exchange,提问作者Karthikeyan Balasubramaniyan
相关产品推荐
相关产品推荐

