首页 > 解决方案 > 异步/等待同步谷歌地图海拔请求

问题描述

我很难弄清楚如何按顺序运行它。我已经尝试了各种Promise.all回调地狱之类的东西,但最终我需要为每个没有高度的点-1获取一个高度,并且在所有这些点都设置好之前不要返回。

google.maps.ElevationService.prototype.getElevationForLocations()仅使用过滤列表调用一次的奖励积分where ins instanceof PosInstruction && ins.$alt === -1)

public async encodeElevations(): Promise<void> {
    let x = 0
    console.warn(x++, 'start')
    await this.$instructions.forEach(async (ins) => {
        console.warn(x++, 'topForEach')

        if (ins instanceof PosInstruction && ins.$alt === -1) {
            const reqPoint: google.maps.LocationElevationRequest = { locations: [ins.$latLng] }

            await google.maps.ElevationService.prototype.getElevationForLocations(reqPoint, async (results: google.maps.ElevationResult[], status) => {
                if (status === google.maps.ElevationStatus.OK) {
                    console.warn(x++, 'status ok')
                    ins.setAlt(results[0].elevation)
                }
                else throw new Error(`encodeElevations() -- ${status.toString()}`)
            })

            console.warn(x++, 'after getElev')
        }
    })

    console.warn(x++, 'done')
}

标签: typescriptgoogle-maps-api-3async-await

解决方案


你不能这样做await getElevationForLocations。它不返回Promise。它在完成时调用回调,可以包装在一个Promise

public async encodeElevations(): Promise<void> {
    let x = 0
    console.warn(x++, 'start')
    const instructions = this.$instructions.filter(ins => ins instanceof PosInstruction && ins.$alt === -1);
    const promiseArray = instructions.map((ins) => {
      console.warn(x++, 'topForEach')
      const reqPoint: google.maps.LocationElevationRequest = { locations: [ins.$latLng] }
      return new Promise((resolve, reject) => {
        google.maps.ElevationService.prototype.getElevationForLocations(reqPoint, (results: google.maps.ElevationResult[], status) => {
          if (status === google.maps.ElevationStatus.OK) {
            console.warn(x++, 'status ok')
            ins.setAlt(results[0].elevation)
            resolve(ins);
          } else {
            reject(new Error(`encodeElevations() -- ${status.toString()}`));
          }
        });

        console.warn(x++, 'after getElev')
      });
    })

    const array = await Promise.all(promiseArray);

    console.warn(x++, 'done')
  }

推荐阅读