uni-app plus.geolocation.watchPosition反复开启关闭会执行多次
uni-app plus.geolocation.watchPosition反复开启关闭会执行多次
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | windows11 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:windows11
HBuilderX类型:正式
HBuilderX版本号:3.96
手机系统:iOS
手机系统版本号:iOS 16
手机厂商:苹果
手机机型:iphone11
页面类型:vue
vue版本:vue2
打包方式:云端
项目创建方式:HBuilderX
### 示例代码:
```javascript
var locationWatcherId = null;
startLocationService(successCallBack = () => {}, failCallBack = () => {}, maximumAge = 60 * 1000) {
locationWatcherId = plus.geolocation.watchPosition((position) => {
console.log('成功')
}, function(e) {
console.log('失败')
}, {
maximumAge, //获取位置间隔时间
});
},
//关闭定位功能
closeLocationService() {
plus.geolocation.clearWatch(locationWatcherId);
locationWatcherId = null;
},
操作步骤:
打开持续定位,在关闭持续定位,第二次打开持续定位就会连续返回2条一样的信息,第三次打开就会重复3次…
预期结果:
反复执行开启关闭,不要重复
实际结果:
反复执行开启关闭,多次执行
bug描述:
打开持续定位,在关闭持续定位,第二次打开持续定位就会连续返回2条一样的信息,第三次打开就会重复3次…
4 回复
我也出现了,难受
我也是,有两个页面都需要用到定位,第一个页面关闭后在第二个页面重新打开就会执行两次,来来回回几次程序都直接崩了,也没有解决办法,无语
解决了吗?
在 uni-app
中,使用 plus.geolocation.watchPosition
来监听设备的地理位置变化时,如果反复开启和关闭监听,可能会导致回调函数被多次执行。这是因为每次调用 watchPosition
都会创建一个新的监听器,而之前的监听器如果没有被正确关闭,仍然会继续执行。
问题原因
watchPosition
会返回一个 watchId
,这个 watchId
用于标识当前的地理位置监听器。如果不使用 clearWatch
来清除之前的监听器,每次调用 watchPosition
都会创建一个新的监听器,导致回调函数被多次执行。
解决方法
为了避免这种情况,你可以在每次开启新的监听器之前,先清除之前的监听器。具体步骤如下:
- 保存
watchId
:在开启监听器时,保存返回的watchId
。 - 清除之前的监听器:在开启新的监听器之前,使用
clearWatch
清除之前的监听器。
示例代码
let watchId = null;
function startWatching() {
// 清除之前的监听器
if (watchId !== null) {
plus.geolocation.clearWatch(watchId);
}
// 开启新的监听器
watchId = plus.geolocation.watchPosition(
function(position) {
console.log("位置变化:", position);
},
function(error) {
console.error("获取位置失败:", error);
},
{
enableHighAccuracy: true, // 高精度模式
maximumAge: 3000, // 缓存时间
timeout: 5000 // 超时时间
}
);
}
function stopWatching() {
if (watchId !== null) {
plus.geolocation.clearWatch(watchId);
watchId = null;
}
}
// 开启监听
startWatching();
// 关闭监听
// stopWatching();