Клуб API Карт

Обращение к переменной в YMaps.Events.observe()

Пост в архиве.

Добрый день!

Помогите пожалуйста с одной задачкой.
Строго не судидте, у меня не очень большой опыт использования JS и Яндекс api. 

 var test111 = [['Адрес 1','111'],['Адрес 2','222'],['Адрес 3','333'],] // пример массива передаваемого на обработку
for(i=0;i<test111.length;i++) {
            

    var geocoder = new YMaps.Geocoder(test111[i][0]);// адрес точки
    var id_city = test111[i][1];//переменная которая нужна в обращение к геокодеру !!!!!


                               
YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {

    var geoCoords = geocoder.get(0).getGeoPoint(),    // получили координаты
   
    var cityName = geocoder.request;    // получили обратно название города

    geoPlacemark.name = cityName+":"+id_city;// Например: здесь необходимо вывести переменную !!!!!
    
........//продолжение кода
    }
    }

 В чём возникла сложность: не получается обратиться к переменной - id_city в YMaps.Events.observe()

Подскажите, пожалуйста, как это возможно сделать???

Спасибо!

UPD: немного не правильно написал - получается обратиться, но записывается последний ID из массива!!!

4 комментария

Это самая распространненая ошибка всех начинающих.

Поскольку событие, на которое вы подписываетесь через observe

случится позже чем произойдет выход из цикла (асинхронно) индекс "i" будет иметь значение test111.length - 1

Оберните ваш код, внутри цикла в self-invoking function и передайте ей индекс в параметрах

Спасибо огромное! всё получилось!) ходил во круг да около того о чём вы написали, но сам дойти так и не смог)

Ещё раз спасибо!)

А можно пример? раз уж это действительно распространенная ошибка... пожалуйста

Давно это было, вроде получилось что-то типо этого

 

 

    for(i=0;i        (function (id_place) {                             
                YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
                    var geoCoords = geocoder.get(0).getGeoPoint(),
                    var cityName = geocoder.request;
                    ... и т.д.
                });
        })(addresses[i][1])
    }