使用async/await的异步函数顺序调用返回undefined问题解决
解决异步函数返回undefined的问题
问题根源
getCoordinates无有效返回值:geolocationImplService.getCoordinates内部仅调用了subscribe,回调里的return只是回调函数的返回值,不会成为方法本身的返回值,导致该方法默认返回undefined。- Observable无法被
await直接等待:trackCurrentPosition返回的是Observable对象,而非Promise,await无法识别Observable的异步逻辑,等于白加。 - 多余的
await使用:latitude和longitude是普通数组元素,不需要用await包裹,属于无效操作。 - 异步方法未等待:如果
getAddressUsingCoordinates是异步方法,调用时未加await会直接返回Promise,而非实际地址结果。
修正方案
1. 转换Observable为Promise
使用RxJS的firstValueFrom(或lastValueFrom)将Observable转为Promise,让await能正确等待异步结果。
2. 修正geolocationImplService方法
// 导入RxJS转换函数 import { firstValueFrom } from 'rxjs'; // ----------- geolocationImplService methods------------ public trackCurrentPosition() { // 直接返回Observable,无需async return this.geolocation.watchPosition(); } public async getCoordinates(position: Observable<Geoposition | PositionError>) { // 等待Observable的第一个值 const positionData = await firstValueFrom(position); const result = [0, 0]; if ("coords" in positionData) { result[0] = positionData.coords.latitude; result[1] = positionData.coords.longitude; } return result; }
3. 修正主业务函数
public async getAddressOfCurrentLocation() { const currentPosition$ = this.trackCurrentPosition(); const coordinates = await this.getCoordinates(currentPosition$); // 去掉多余的await const latitude = coordinates[0]; const longitude = coordinates[1]; const options: NativeGeocoderOptions = { useLocale: NATIVE_GEOCORDER_OPTIONS.USE_LOCALE, maxResults: NATIVE_GEOCORDER_OPTIONS.MAX_RESULTS }; // 异步方法必须加await const address = await this.getAddressUsingCoordinates(latitude, longitude, options); return address; } private trackCurrentPosition() { // 直接返回Observable,无需async/await return this.geolocationImplService.trackCurrentPosition(); } private async getCoordinates(position: Observable<Geoposition | PositionError>) { return this.geolocationImplService.getCoordinates(position); }
补充说明
- 若使用RxJS 6或更早版本,可替换
firstValueFrom为toPromise()(该方法已废弃,优先推荐前者)。 - 如果只需要获取一次当前位置,建议用
getCurrentPosition()替代watchPosition(),避免持续监听位置变化。
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

