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')
}
我很难弄清楚如何按顺序 运行。我已经尝试了各种 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')
}