function updateScreenContent() {
app.map.mapObject.getVisibleRegion(function (bounds) {
app.ajaxUpdater = $.ajax({
type: "GET",
url: "myapi.com/chickens/",
data: {coordinates: bounds.toUrlValue()},
dataType: "JSON"
})
.done(function (mapItems, status) {
for (var i = 0; i < mapItems.length; i++) {
if (!matchFound) {
app.map.mapObject.addMarker({
position: new plugin.google.maps.LatLng(mapItems[i].latitude, mapItems[i].longitude),
icon: app.map.icons.stop
}, function (item) {
item.id = mapItems[i].id;
app.map.mapContent.push("PUSH ME INTO THE ARRAY!!!!!");
});
}
}
})
});
}
每次地图在我们的应用程序中变为空闲时都会调用上述函数,这可能是每500毫秒或更长时间,具体取决于用户何时停止移动地图。
我的问题是,我似乎无法在成功添加标记的回调中添加任何内容到我的mapContent数组。我知道它被调用了,因为我已经在那里发出警报,并且标记也已成功添加到地图中。
每当我检查mapContent的长度时,它始终为0.它完全没有意义!如果我在回调之外推送到数组就可以了。
有什么想法吗?
编辑:
addMarker
是一个异步函数。这可能是为什么?
答案 0 :(得分:1)
我怀疑它是一个封闭问题;当调用app.map.mapContent.push
的匿名函数执行时,i
的值不是数组的有效索引,因为JavaScript没有(自动)具有块级别的变量范围。本质上,当该函数执行时,i
的值是它的循环的最终值,而不是实际调用addMarker时的值。这会导致推送上方的行引发错误,因为mapItems[i]
会返回undefined
,而您无法访问id
属性。
您可以使用立即调用的函数表达式(IIFE)创建一个新的闭包来为每次迭代保留i
的值,如下所示:
(function(i) {
app.map.mapObject.addMarker({
position: new plugin.google.maps.LatLng(mapItems[i].latitude, mapItems[i].longitude),
icon: app.map.icons.stop
}, function (item) {
item.id = mapItems[i].id;
app.map.mapContent.push("PUSH ME INTO THE ARRAY!!!!!");
});
})(i);