收藏
回答

循环遍历列表存储该列表对应下的用户当前地理坐标

问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
API和组件 小程序 Bug wx.getLocation(OBJECT) 客户端 6.5.3 2.0.0

- 当前 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);
  },


最后一次编辑于  2018-09-04  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏关注问题回答

7 个回答

  • *羲&翱&颯*
    *羲&翱&颯*
    2018-09-04

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

    2018-09-04
    赞同
    回复
  • 卢霄霄
    卢霄霄
    2018-09-04

    请使用闭包或者递归。

    闭包:

    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()
                }
            },
        })
    }


    2018-09-04
    赞同
    回复 5
    • *羲&翱&颯*
      *羲&翱&颯*
      2018-09-04

      这个闭包处理好像不行啊

      getPositions:function(){
          var list=[];
          var worker=wx.createWorker
          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++){
            var j=i;
            wx.getLocation({
              success: function(res) {
                list[j].position.lat=res.latitude;
                list[j].position.lng=res.longitude;
                console.log(list);
              },
            })
          }
        },

      运行结果:

      这个不是我想要的结果啊,只改变了一个值

      递归可以

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


      2018-09-04
      赞同
      回复
    • 卢霄霄
      卢霄霄
      2018-09-04回复*羲&翱&颯*

      不要用var ,用let啊。。。我都写给你了。。你非要改

      2018-09-04
      赞同
      回复
    • *羲&翱&颯*
      *羲&翱&颯*
      2018-09-04回复*羲&翱&颯*

      抱歉,那个闭包中的

      let j = i;

      我用成了

      var j=i;

      通过var定义的变量,作用域是整个封闭函数,是全域的 。通过let定义的变量,作用域是在块级或是子块中;

      可以参考https://blog.csdn.net/zuiziyoudexiao/article/details/76890102

      2018-09-04
      赞同
      回复
    • *羲&翱&颯*
      *羲&翱&颯*
      2018-09-04回复卢霄霄

      知错了

      2018-09-04
      赞同
      回复
    • 卢霄霄
      卢霄霄
      2018-09-04回复*羲&翱&颯*

      哈哈哈哈。。错一次,涨了经验啊~

      2018-09-04
      赞同
      回复