Таким образом, вы, вероятно, видели нечто подобное много, где у кого-то есть проблема с использованием переменной "i" в функциях внутри цикла for. Теперь это можно легко зафиксировать с помощью:
(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.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", вам просто нужно нажать на него, и вы увидите проблему.
Код находится в файле gallped GMap.js в строке с 134 по 142. Надеюсь, я дам вам достаточно информации!
По этой причине вы не должны создавать функции внутри циклов 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));