Клуб API Карт

Подскажите пожалуйста как доставить доп. данные для свойств плэйсмарка создаваемого на основании геокодинга из цикла

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

Добрый день!

В моём приложенин на ASP.Net при загрузке страницы javascript выполняет метод из codebehind, результат которого пакуется в json и суётся обратно. Дальше в джаваскрипте я перебираю в цикле объекты запакованные в json (объект пока что состоит из строки адреса [addressString] и пресета твирл [colorST]), делаю по каждому адресу геопоиск, и на основании результата геописка создаю плэйсмарк и помещаю его на карту. Это работает, но! Я не могу передать в функцию создания плэйсмарка никаких переменных из json объекта (например пресет твирл). 

function OnMyMethodComplete(result) {

     var c = JSON.parse(result);

     for (var i = 0; i < c.length; i++) {

         ymaps.geocode(c[i].addressString, {

             results: 1

         }).then(function (res) {

             var firstGeoObject = res.geoObjects.get(0);

             myPlacemark = new ymaps.Placemark(firstGeoObject.geometry.getCoordinates(), {

                 balloonContent: ''

             }, {

                 preset: 'twirl#greenIcon'

             })

             myMap.geoObjects.add(myPlacemark);

         }, function (err) {})

     }

 }

 

  

function OnMyMethodComplete(result) {

     var c = JSON.parse(result);

     for (var i = 0; i < c.length; i++) {

         ymaps.geocode(c[i].addressString, {

             results: 1

         }).then(function (res) {

             var firstGeoObject = res.geoObjects.get(0);

             myPlacemark = new ymaps.Placemark(firstGeoObject.geometry.getCoordinates(), {

                 balloonContent: ''

             }, {

                 preset: c[i].colorST

             })

             myMap.geoObjects.add(myPlacemark);

         }, function (err) {})

     }

 }

 

Помогите разобраться с этой штукой, пожалуйста! 

14 комментариев

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

Александр Щербаков
28 января 2016, 01:48

Угу.

Что же делать-то? В вызов функции, я так понимаю, это совать бесполезно:

 ymaps.geocode(c[i].addressString, {

             results: 1

         }).then(function (res,c,i)

 

так не работает.

Как же такие задачи решаются?

Надо учить JavaScript, все новички наступают на эти грабли и задаются этим вопросом. Нажмите на соотв. тэг в вашем посте и Вы найдете ответ.

Александр Щербаков
28 января 2016, 01:48

Если "все новички наступают на эти грабли" может имело бы смысл повесить нормальный пример который бы исключил такие вопросы.

Пример есть

Но он не научит Вас программировать на JavaScript, т.к. проблема с асинхронностью и циклами может возникнуть при решении множества задач.

Александр Щербаков
28 января 2016, 01:48

Я не собираюсь программировать на JavaScript. Мне нужно решить конкретную задачу и вернуться к своей работе.

Вот это называется примером: http://dedmazdie.blogspot.ru/2011/02/blog-post_24.html

А то на что вы даете ссылку - простыня.

Тогда нужно писать такой пост:

"""

Всем привет!

Я ничего не знаю и знать не хочу.

Напишите все за меня, чтобы я мог сделать Ctrl-C, Ctrl-V

С меня пиво.

"""

Александр Щербаков
28 января 2016, 01:48

Сразу видно что у Вас дофига свободного времени. Вместо того чтобы один раз написать нормальный законченый пример по типовой задаче Вы предпочитаете учить людей как им писать посты.

На сам класс множественного геокодирования написана документация (jsDoc)

Код примера содержит 8 строчек, не считая данные и тоже снабжен комментариями.

Не вижу смысла писать этот же код еще раз в теле поста.

 

Александр Щербаков
28 января 2016, 01:48

Ну это как бэ совсем не то что нужно. С геокодингом кучи объектов проблем нет. Не понятно как и в какой момент кастомные свойства добавить при нанесении меток на карту.

По индексу добавляйте когда все данные получены

Александр Щербаков
28 января 2016, 01:48

А если будут исключения? Фи какое некрасивое решение.

Александр Щербаков
28 января 2016, 01:48

Отказался от геокодинга на лету, прогнал все объекты через HTTP геокодер. Буду делать метки на основании готовых координат.

Александр Щербаков
28 января 2016, 01:48

В таком виде все получилось.