typescript - 异步/等待同步谷歌地图海拔请求
问题描述
我很难弄清楚如何按顺序运行它。我已经尝试了各种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')
}
解决方案
你不能这样做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')
}
推荐阅读
- django - 如何将一个模型的pk转移到另一个模型
- reactjs - addEventListener 的奇怪行为 - ReactJs
- c++ - 运行时错误:空指针内的成员访问
- c++ - 如何避免将向量的整个值复制到另一个容器
- c# - 使用 C# 客户端 API 从 GmailService 获取电子邮件地址
- amazon-web-services - AWS System Manager 可以以 ec2-user 身份登录吗
- javascript - 使用 vuetify 验证密码
- vim - Vim 插件不在主目录中时不起作用
- sql - oracle替换逗号,但前提是后面没有空格
- nginx - 调用 nginx 提供的 PHP 页面而不使用文件扩展名