成功回调后无法将字符串推送到数组

时间:2014-06-11 12:22:09

标签: javascript

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是一个异步函数。这可能是为什么?

1 个答案:

答案 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);