回调成功后,不能将字符串推入数组

Can't push string to array after successful callback

本文关键字:字符串 数组 不能 成功 回调      更新时间:2023-09-26
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);