【问题标题】:javascript, including variables from loop inside google functionsjavascript,包括来自谷歌函数内部循环的变量
【发布时间】:2013-12-10 14:48:42
【问题描述】:

所以你可能已经看到过很多类似的事情,有人在 for 循环内的函数中使用“i”变量时遇到问题。现在可以很容易地解决这个问题:

(function(){
    return function() {
        //something
    }
})(i);

但是,我该如何在我的场景中做到这一点?

GMap.prototype.drawDirection = function (directionsRenderer, directionsService, headMarker, tailMarkers, callback) {
var request;
var array = [];
var count = 0;
for (var i = 0; i < tailMarkers.length; i++) {
    count = i;

    request = {
        origin: headMarker.getPosition(),
        destination: tailMarkers[i].getPosition(),
        travelMode: google.maps.DirectionsTravelMode.DRIVING,
        unitSystem: google.maps.DirectionsUnitSystem.METRIC
    };
    directionsService.route(request, function (response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            directionsRenderer.setDirections(response);
            console.log(i + " " + count);
            callback(response.routes[0].legs[0].distance.value, i, tailMarkers.length - 1);
        } else {
            alert('Error: ' + status);
        }
    });
    }
};

更准确地说,是关于directionsService对象:

directionsService.route(request, function (response, status) {
    if (status == google.maps.DirectionsStatus.OK) {
        directionsRenderer.setDirections(response);
        console.log(i + " " + count);
        callback(response.routes[0].legs[0].distance.value, i, tailMarkers.length - 1);
    } else {
        alert('Error: ' + status);
    }
});

现在,我不想使用 JFiddle,因为它会写很多东西,所以我只想链接到我正在尝试这个的网站。

http://stud.aitel.hist.no/~andersfy/html5.proj/

如果您查看右下角的复选框,其中显示“vis min posisjon”,您只需单击它,您就会看到问题。

代码位于文件 GMap.js 的第 134 到 142 行。 希望我能给你足够的信息!

【问题讨论】:

标签: javascript jquery api google-maps google-maps-api-3


【解决方案1】:

出于这个原因,您不应该在 for 循环内创建函数。

你的问题在于这个闭包,它共享变量 i

function (response, status) {
    if (status == google.maps.DirectionsStatus.OK) {
        directionsRenderer.setDirections(response);
        console.log(i + " " + count);
        callback(response.routes[0].legs[0].distance.value, i, tailMarkers.length - 1);
    } else {
        alert('Error: ' + status);
    }
}

我会重写该函数以不依赖于i,但如果你需要i 那么

/*before your for loop */
function createRouter(i){
    return function (response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            directionsRenderer.setDirections(response);
            console.log(i + " " + count);
            callback(response.routes[0].legs[0].distance.value, i, tailMarkers.length - 1);
        } else {
            alert('Error: ' + status);
        }
    }
};

/* in your for loop */
directionsService.route(request, createRouter(i));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多