Async/Await 用于同步 Google 地图海拔请求

Async/Await for Synchronous Google Maps Elevation Request

我很难弄清楚如何按顺序 运行。我已经尝试了各种 Promise.all 和回调地狱之类的东西,但最终我需要为没有 -1 的每个点获取海拔高度,而不是 return直到全部设置完毕。

仅使用 ins instanceof PosInstruction && ins.$alt === -1)

过滤列表调用 google.maps.ElevationService.prototype.getElevationForLocations() 一次的奖励积分
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')
}

你做不到await getElevationForLocations。它没有 return 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')
  }