getLocation() { const that = this uni.getLocation({ geocode: true, type: 'wgs84', // #ifdef MP-ALIPAY type: 2, // #endif success(res) { console.log('---',res) res.name = res.city res.citycode = res.cityAdcode that.myCityObj = res that.hasLocation = true uni.setStorageSync('nowCityObj', res) //逆地址解析 坐标转地址信息 qqmapsdk.reverseGeocoder({ //Object格式 location: { latitude: res.latitude, longitude: res.longitude }, success: function(res1) {//成功后的回调 that.myCityObj.name = res1.result.address_component.city },fail: function(error) { console.error(error); }, complete: function(res) { //console.log(res); } }); }, fail(err) { that.hasLocation = false uni.showToast({ icon:'none', title: '获取用户定位失败,请手动选择当前城市' }) }, }) },
时间: 2024-03-03 07:52:16 浏览: 27
这段代码看起来是一个 Vue.js 组件中的 getLocation 方法。该方法使用 uni.getLocation 函数获取用户的定位信息,并将其保存到 myCityObj 属性中。如果定位成功,它会将 hasLocation 属性设置为 true,并将 myCityObj 对象存储到本地缓存中。除此之外,它还使用了 qqmapsdk.reverseGeocoder 函数来将获取到的经纬度信息转换为详细的地址信息,并将地址信息中的城市名称保存到 myCityObj.name 属性中。如果定位失败,它会将 hasLocation 属性设置为 false,并弹出一个提示框提示用户手动选择当前城市。需要注意的是,在支付宝小程序中,它将 type 属性设置为 2,而在其他平台中,type 属性设置为 'wgs84'。
相关问题
优化精简这段代码// pages/Stores/Stores.js // 请求封装 import request from '../../utils/request' // 高德地图 import amapFile from '../../libs/amap-wx.130' // 地图实例 var myAmapFun Page({ data: { map: [] }, onLoad(options) { console.log(options) const that = this wx.createWACode({ path: '/pages/index/index', width: 430, scene: 'custom_value' }).then(res => { // 在页面中显示生成的小程序码 this.setData({ qrcodeUrl: res.path }); }).catch(err => { console.error(err); }); myAmapFun = new amapFile.AMapWX({ key: '5409c5fd8a9d2c7dfecef1faa8cd3ffc' }); wx.getLocation({ type: 'wgs84', isHighAccuracy: true, success(res) { that.setData({ latitude: res.latitude, longitude: res.longitude, speed: res.speed, accuracy: res.accuracy }) request( '/stores/stores', {}, 'POST').then(res => { that.setData({ map: res.data, }) that.calculateDistance() }) } }) }, // 计算附近门店距离 calculateDistance() { const that = this; const mapVar = JSON.parse(JSON.stringify(that.data.map)); const promises = []; mapVar.forEach(item => { const origin = that.data.longitude + ',' + that.data.latitude; const destination = item.longitude + ',' + item.latitude; const promise = new Promise((resolve, reject) => { myAmapFun.getDrivingRoute({ origin: origin, destination: destination, success: function (data) { item.distance = Math.round(data.paths[0].distance / 100) / 10; resolve(); }, fail: function (err) { reject(err); } }); }); promises.push(promise); }); Promise.all(promises).then(() => { that.setData({ map: mapVar }); console.log(that.data.map) }).catch(err => { console.error(err); }); }, onShareAppMessage() { return { title: '分享标题', path: '/pages/index/index?custom_param=custom_value' }; } })
下面是对代码的优化和精简:
1. 对于使用频率较高的导入模块,可以将其放在全局变量中,避免在每次使用时都要重新导入。
2. 对于重复使用的变量,可以使用 const 声明变量,避免变量被无意中修改。
3. 对于异步请求,可以使用 async/await 语法糖,让代码更加清晰易读。
4. 对于重复调用的函数,可以将其封装成工具函数,提高代码的复用性。
5. 对于大量的 Promise 链式调用,可以使用 Promise.all() 方法,同时处理多个 Promise 对象,避免产生大量的嵌套。
优化后的代码如下:
```js
import request from '../../utils/request'
import amapFile from '../../libs/amap-wx.130'
const myAmapFun = new amapFile.AMapWX({
key: '5409c5fd8a9d2c7dfecef1faa8cd3ffc'
})
Page({
data: {
qrcodeUrl: '',
map: []
},
async onLoad(options) {
const { longitude, latitude } = await this.getLocation()
const map = await this.getNearbyStores()
this.setData({
map,
...{ longitude, latitude },
qrcodeUrl: await this.createWACode()
})
await this.calculateDistance()
},
// 获取用户当前位置信息
getLocation() {
return new Promise((resolve, reject) => {
wx.getLocation({
type: 'wgs84',
isHighAccuracy: true,
success(res) {
resolve({
longitude: res.longitude,
latitude: res.latitude
})
},
fail(err) {
reject(err)
}
})
})
},
// 获取附近的门店信息
getNearbyStores() {
return request('/stores/stores', {}, 'POST').then(res => {
return res.data
})
},
// 生成小程序码
createWACode() {
return wx.createWACode({
path: '/pages/index/index',
width: 430,
scene: 'custom_value'
}).then(res => {
return res.path
}).catch(err => {
console.error(err)
})
},
// 计算附近门店距离
calculateDistance() {
const { longitude, latitude, map } = this.data
const mapVar = JSON.parse(JSON.stringify(map))
const promises = mapVar.map(item => {
const origin = `${longitude},${latitude}`
const destination = `${item.longitude},${item.latitude}`
return new Promise((resolve, reject) => {
myAmapFun.getDrivingRoute({
origin,
destination,
success(data) {
item.distance = Math.round(data.paths[0].distance / 100) / 10
resolve()
},
fail(err) {
reject(err)
}
})
})
})
return Promise.all(promises).then(() => {
this.setData({ map: mapVar })
console.log(this.data.map)
}).catch(err => {
console.error(err)
})
},
onShareAppMessage() {
return {
title: '分享标题',
path: '/pages/index/index?custom_param=custom_value'
}
}
})
```
buttonTap: { wx.getLocation({ type:'gcj02', success:function (res) { wx.openLocation({ latitude: res.latitude, longitude: res.longitude, }) } }) } data: { latitude:"45.743291" ,longitude="127.2126" markers:[{ iconPath:'/images/navi.png', id:0, latitude:"45.743291" ,longitude="127.2126", width:50, height:50 }] } markertap: function() { wx.openLocation({ latitude: this.data.latitude, longitude: this.data.longitude, name:'哈尔滨信息工程学院', address:'' }) } function()报错
这段代码中存在一些语法错误和逻辑错误,可能会导致程序运行出错:
1. 在data对象中,longitude的赋值符号应该是冒号而不是等号,应该改为:
```
data: {
latitude: "45.743291",
longitude: "127.2126",
markers: [{
iconPath: '/images/navi.png',
id: 0,
latitude: "45.743291",
longitude: "127.2126",
width: 50,
height: 50
}]
}
```
2. buttonTap事件中调用了wx.getLocation方法,但是该方法是异步的,因此需要使用回调函数来获取位置信息。可以将wx.getLocation的调用放到一个单独的函数中,并在成功获取位置信息后调用wx.openLocation方法。改进后的代码如下:
```
buttonTap: function() {
var that = this;
wx.getLocation({
type: 'gcj02',
success: function(res) {
that.openLocation(res.latitude, res.longitude);
}
})
},
openLocation: function(latitude, longitude) {
wx.openLocation({
latitude: latitude,
longitude: longitude,
name: '哈尔滨信息工程学院',
address: ''
})
},
```
3. markertap事件中调用了wx.openLocation方法,但是传入的参数不正确,应该是this.data.markers[0].latitude和this.data.markers[0].longitude,而不是this.data.latitude和this.data.longitude。改进后的代码如下:
```
markertap: function() {
wx.openLocation({
latitude: this.data.markers[0].latitude,
longitude: this.data.markers[0].longitude,
name: '哈尔滨信息工程学院',
address: ''
})
},
```
希望这些改动能够解决你的问题。