异步/等待同步谷歌地图高程请求



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

仅使用过滤列表呼叫google.maps.ElevationService.prototype.getElevationForLocations()一次的奖励积分,其中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')
}

你不能做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')
}

最新更新