如何在 HTML5 GeoLocation API 中使用异步等待?

Mai*_*jat 10 javascript asynchronous promise w3c-geolocation

第一个方法返回承诺。

getCoordinates() {
  return new Promise(function(resolve, reject) {
    navigator.geolocation.getCurrentPosition(resolve, reject);
  });
}
Run Code Online (Sandbox Code Playgroud)

返回reverseGeoCode方法的结果。

async getAddress() {
  await this.getCoordinates().then(position => {
    let latitude = position.coords.latitude;
    let longitude = position.coords.longitude;
    let url = Constants.OSMAP_URL + latitude + "&lon=" + longitude;
    // Reverse geocoding using OpenStreetMap
    return this.reverseGeoCode(url);
  });
}
Run Code Online (Sandbox Code Playgroud)

使用自定义类进行 API 调用并返回结果。

reverseGeoCode(url) {
  let requestService = new RequestService("json", url);
  requestService.call().then(result => {
    return result;
  });
}
Run Code Online (Sandbox Code Playgroud)

我是这样称呼的:

let geoLocation = new GeoLocation();
geoLocation.getAddress().then(r => {
  console.log(r);
});
Run Code Online (Sandbox Code Playgroud)

控制台日志未定义。

Lyu*_*mir 8

显示的片段有几个问题

  1. getAddress()实际上return什么都没有。

  2. 如果await使用,then()则不需要,反之亦然(阻塞或非阻塞,而不是两者)。

这是一个正确的版本

async getAddress() {
  // notice, no then(), cause await would block and 
  // wait for the resolved result
  const position = await this.getCoordinates(); 
  let latitude = position.coords.latitude;
  let longitude = position.coords.longitude;
  let url = Constants.OSMAP_URL + latitude + "&lon=" + longitude;

  // Actually return a value
  return this.reverseGeoCode(url);  
}
Run Code Online (Sandbox Code Playgroud)

您还必须以reverseGeoCode类似的方式重写,例如

async reverseGeoCode(url) {
  let requestService = new RequestService("json", url);
  return await requestService.call();
}
Run Code Online (Sandbox Code Playgroud)


小智 5

下面的代码显示了类似的问题。尝试重构它。记住awaitasync函数中使用它。就像是:

window.onload = async () => {

const getCoords = async () => {
        const pos = await new Promise((resolve, reject) => {
          navigator.geolocation.getCurrentPosition(resolve, reject);
        });
    
        return {
          long: pos.coords.longitude,
          lat: pos.coords.latitude,
        };
    };

const coords = await getCoords();
}



 
Run Code Online (Sandbox Code Playgroud)