- 当前 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); }, |
请使用闭包或者递归。
闭包:
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()
}
},
})
}
这个闭包处理好像不行啊
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);
},
})
}
不要用var ,用let啊。。。我都写给你了。。你非要改
抱歉,那个闭包中的
let j = i;
我用成了
var
j=i;
通过var定义的变量,作用域是整个封闭函数,是全域的 。通过let定义的变量,作用域是在块级或是子块中;
可以参考https://blog.csdn.net/zuiziyoudexiao/article/details/76890102
知错了
哈哈哈哈。。错一次,涨了经验啊~
找到解决方案了,需要用到线程。。。。。。。。不知道行不行