如何使用javascript

时间:2018-08-23 21:28:37

标签: javascript promise es6-promise

我正在尝试使用HTML5地理位置API和Google Maps Geocoding API获取用户的国家/地区名称。我正在使用自定义模式来优雅地请求权限。如何访问返回的国家简称?目前,我得到undefined

function fetchCountry() {
  showCustomModal('To show data most relevant to you we need your location', {
    options: ['done', 'cancel']
  })
    .then(function(value) {
      if(value == 'cancel') return;

      navigator.geolocation.getCurrentPosition(function (position) {

        //if user agrees to share location info

        let latitude = position.coords.latitude;
        let longitude = position.coords.longitude;

        fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`)
          .then(response => response.json())
          .then(function (response) {

            //checking geocoding api response for errors
            if (response.status != 'OK' || !response.results[0]) return;

            for (let addressComponent of response.results[0].address_components) {
              if (addressComponent.types.includes('country'))
                return addressComponent.short_name; //returning country short name
            }

          });
      }, function () {
        //if does not gets the current position show error message
        //do something...
      });
    });
}

let country = fetchCountry();

1 个答案:

答案 0 :(得分:1)

您可以引入一个承诺,当subseuqnet异步请求被解决(成功)或被拒绝(失败)时,该承诺将被解决, 如下所示

function fetchCountry() {

  // Add return statement here
  return showCustomModal('To show data most relevant to you we need your location', {
    options: ['done', 'cancel']
  })
    .then(function(value) {
      if(value == 'cancel') return;

      // Introduce the promise which will asynchronously process the post-modal request logic, and return a result on completion
      // or failure of that request
      return new Promise(function(resolve, reject) {

        navigator.geolocation.getCurrentPosition(function (position) {

          //if user agrees to share location info

          let latitude = position.coords.latitude;
          let longitude = position.coords.longitude;

          fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`)
            .then(response => response.json())
            .then(function (response) {

              //checking geocoding api response for errors
              if (response.status != 'OK' || !response.results[0]) {
                reject(); // Call reject to relay and failed request
              }

              for (let addressComponent of response.results[0].address_components) {
                if (addressComponent.types.includes('country'))
                  resolve(addressComponent.short_name); //returning country short name, via resolve
              }

            });
        }, function () {
          //if does not gets the current position show error message
          //do something...
          reject('Failed to get position') // Call reject to relay and failed request
        });
      })
    });
}

fetchCountry().then(function(country) {

  //access country here
}).catch(function(err) {

  //handle error here
})