循环遍历列表存储该列表对应下的用户当前地理坐标
发布于 6 年前 作者 leiwei 8760 次浏览 来自 问答
  • 当前 Bug 的表现(可附上截图)

通过for循环遍历列表信息,进行对列表信息中的定位信息进行更新为当前定位信息,报错undefined,初步认识到可能是for循环遍历较快,而获取定位信息较慢,造成这种情况,就想知道有没有可以让for循环中的每一轮执行时暂停一会再执行的方法,可能或提出将for循环放在wx.getLocation()方法之内,但是我的最终目的是通过for循环进行地址解析,所以for循环要放在外侧。

  • 预期表现

列表中的各项定位信息更新为当前定位信息

  • 复现路径
  • 提供一个最简复现 Demo
getPositions:function(){
    var list=[];
    for(var i=0;i<3;i++){
      var item = {
        id: i,
        name: 'pp'+i,
        position: {
          lat: 0,
          lng: 0
        }
      };
      list.push(item);
    }
    console.log(list);
    for(var i=0;i<list.length;i++){
      wx.getLocation({
        success: function(res) {
          list[i].position.lat=res.latitude;
          list[i].position.lng=res.longitude;
        },
      })
    }
    console.log(list);
  },
2 回复

请使用闭包或者递归。

闭包:

onLoad() {
 
        var list = [];
        for (var i = 0; i < 3; i++) {
            var item = {
                id: i,
                name: 'pp' + i,
                position: {
                    lat: 0,
                    lng: 0
                }
            };
            list.push(item);
        }
        for (var i = 0; i < list.length; i++) {
            let j = i
            wx.getLocation({
                success: function(res) {
                    list[j].position.lat = res.latitude;
                    list[j].position.lng = res.longitude;
                    console.log(list);
                },
            })
        }
    }

递归:

onLoad() {
 
    this.list = [];
    for (var i = 0; i < 3; i++) {
        var item = {
            id: i,
            name: 'pp' + i,
            position: {
                lat: 0,
                lng: 0
            }
        };
        this.list.push(item);
    }
    this.pos = 0
    this.digest()
},
digest(){
    wx.getLocation({
        success: (res)=> {
            console.log(this.pos)
            this.list[this.pos].position.lat = res.latitude;
            this.list[this.pos].position.lng = res.longitude;
            console.log(this.list);
            if (++this.pos < this.list.length){
                this.digest()
            }
        },
    })
}

找到解决方案了,需要用到线程。。。。。。。。不知道行不行

回到顶部