Клуб API Карт

Placemark и содержимое Balloons

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

Встал вопрос в создании множества меток с различным содержанием на карте.

Привожу кусочек кода: 

// strvalue = [['Красноярск','Это не Новосибирск', 'Это ссылка1', 'Это заголовок1'],
//['Новосибирск','Это не Красноярск', 'Это ссылка2', 'Это заголовок2'],
//['Абакан','Это не Новосибирск  не Красноярск', 'Это ссылка3', 'Это заголовок3']]
var length = strvalue.length
for(var i = 0; i < length; i++) {
    var geodot = strvalue[i][0];
    var baldiscrip = strvalue[i][1];
    var balfooter = strvalue[i][2];
    var balheader = strvalue[i][3];
    var myGeocoder = ymaps.geocode(geodot);
    myGeocoder.then(function (res) {
        var firstGeoObject = res.geoObjects.get(0);
        myPlacemark = new ymaps.Placemark(
            firstGeoObject.geometry
            .getCoordinates(), {
                iconContent: '',
                balloonContentHeader: '<strong>' +
                    balheader +
                    '</strong>',
                balloonContent: baldiscrip,
                balloonContentFooter: balfooter
            }, {
                preset: 'twirl#violetIcon'
            });
        myMap.geoObjects.add(myPlacemark);
    });
};

 

В результате выполнения скрипта, получаю Placemark в различных географических координатах, но с одинаковым содержанием, соответствующему содержанию последних элементов массива strvalue:

Это не Новосибирск  не Красноярск', 'Это ссылка3', 'Это заголовок3'.

Интересно: где напортачил и как можно исправить.

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

Геокодирование - асинхронный процесс, на момент получения ответа от сервера, значение переменной "i" будет равно length - 1

Так же нужно учесть, что последовательность ответов от сервера может быть различной, одни запросы могут обрабатываться дольше других.

Так же нужно учесть что не все 100% запросов могут быть обработаны (иногда случаются ошибки),

а так же геокодер может ничего не найти по некоторым запросам.

Спасибо! Хорошо, что обратили мое внимание так же на вещи связанные с асинхронной работой.

Геокодирование на клиенте это всегда плохое решение, которого надо по возможности избегать.

Если есть возможность сделать это один раз на сервере, прогнав все ваши адреса через http-геокодер, надо ей воспользоваться.

Есть узкий круг задач, когда точки добавляются пользователем, непосредственно во время работы с картой, и есть необходимость их геокодировать сразу.

В случае же когда данные приходят с сервера геокодировать на клиенте слишком дорого, в первую очередь для самого клиента (траффик, время ожидания ответа) так и для разработчика сайта, - ввиде необходимости работы с асинхронными запросами