Vue 中使用百度地图 API 进行逆地址解析,如何等待回调完成后再执行后续操作?

      var myGeo = new window.BMap.Geocoder()

      // 获取经纬度
      var getPosition = function(data) {
        var position = {}
        data.forEach(item => {
          myGeo.getPoint(
            item.name,
            point => {
              if (point) {
                position[item.name] = [point.lng, point.lat]
                console.log(`${item.name}: ${[point.lng, point.lat]}`)
              }
            },
            item.name
          )
        })
        return position
      }

      // 经纬度信息
      var geoCoordMap = getPosition(data)

相关的代码如上,在getPosition方法中,有一个调用的百度地图的 API 进行逆地址解析,回调函数可能由于网络的原因在返回之后才执行,如何将这段代码改为等待回调函数全部执行完毕后,再返回position对象?

阅读 5.1k
2 个回答

forEach 换成 map,以返回迭代对象;
其得到的 a 是由多个 Promise 对象元素组成的数组;
接着使用 Promise.all(),具体用法请查看对应文档。

var getPosition = async function (data) {
  var position = {}
  let a = data.map(item => {
    return new Promise(resolve => {
      myGeo.getPoint(
        item.name,
        point => {
          if (point) {
            position[item.name] = [point.lng, point.lat]
            console.log(`${item.name}: ${[point.lng, point.lat]}`)
          }
          resolve()
        },
        item.name
      )
    })
  })
  await Promise.all(a)
  return position
}

Promise 和 Promise.all 方案是对的。

楼上的 resolve() 没有参数吗,不应该是回调里面触发吗。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题