JavaScript, включая переменные из цикла внутри функций Google

0

Таким образом, вы, вероятно, видели нечто подобное много, где у кого-то есть проблема с использованием переменной "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. Надеюсь, я дам вам достаточно информации!

  • 0
    Просто, кстати, это не работает: pastebin.com/Ni4H9w38
Теги:
google-maps
google-maps-api-3

1 ответ

0
Лучший ответ

По этой причине вы не должны создавать функции внутри циклов 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));
  • 0
    большое спасибо! :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню