uni-app plus.geolocation.watchPosition反复开启关闭会执行多次

发布于 1周前 作者 h691938207 来自 Uni-App

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 都会创建一个新的监听器,导致回调函数被多次执行。

解决方法

为了避免这种情况,你可以在每次开启新的监听器之前,先清除之前的监听器。具体步骤如下:

  1. 保存 watchId:在开启监听器时,保存返回的 watchId
  2. 清除之前的监听器:在开启新的监听器之前,使用 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();
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!