回调成功后,不能将字符串推入数组
Can't push string to array after successful callback
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。这完全没有道理!如果我在回调函数外push到数组,它会工作。
任何想法?
编辑: addMarker
为异步函数。这可能是原因吗?
我怀疑这是一个闭包问题;当调用app.map.mapContent.push
的匿名函数执行时,i
的值不是数组的有效索引,因为JavaScript没有(自动)块级别的变量范围。本质上,当该函数执行时,i
的值是循环的最终值,而不是实际调用addMarker时的值。由于mapItems[i]
返回的undefined
不能访问id
属性,因此会导致push上面的行抛出错误。
您可以创建一个新的闭包,通过使用立即调用的函数表达式(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);
相关文章:
- 将JSON转换为typescript中的字符串数组
- 在Javascript中将一个值和字符串数组转换为if语句
- 如何将正则表达式包含到字符串数组中
- JavaScript:将字符串数组转换为文本区域
- Knockout中的字符串数组
- 拆分字符串数组(JavaScript)后未定义
- 使用Javascript获取两个字符串之间的字符串数组
- 打印从Spring MVC Controller发送的字符串数组只显示“;toJSON”;在javascript中
- 将一个字符串数组解析为一个新的数组javascript
- AngularJS - 从字符串数组中连续更改文本
- 使用字符串数组中的字符填充 HTML 表
- 如何在 Javascript 中将字符串数组列表插入到表行中
- 创建二维字符串数组
- 如何从字符串数组中获取子字符串数组
- 如何将字符串数组转换为简单数组
- 按字母顺序、数字顺序和特殊字符对字符串数组进行排序
- 如何从字符串数组中获得8个随机唯一元素
- json_encode($myVar);正在给出地图,我想要一个字符串数组
- 函数,返回javascript中两个字符串数组的差值
- Javascript字符串数组转换为用逗号分隔的多个字符串