Клуб API Карт

Передать параметр в ответ route

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

Добрый день. 

В старой версии API (в 2.0, если не ошибаюсь) можно было передать в опциях любой параметр и он был доступен через routeOptions.

В 2.1 же такой параметр пропал и теперь я не понимаю как передать данные (в частности metro[i] - мои данные о метро ) в then().

Ниже код, который не работает на 2.1 (нет параметра routeOptions). Если убрать вывод названия метро (obj.routeOptions.metro.name), код заработает.

Подскажите, пожалуйста, как мне передать параметр в then()

router[i] = ymaps.route([
        [$('#additem_coord_y').val(), $('#additem_coord_x').val()],
        [metro[i].coordinates_y, metro[i].coordinates_x]
    ], {
        multiRoute: true,
        routingMode: 'pedestrian',
        metro: metro[i]
    }
);
router[i].then(function (obj) {
    $('#additem_metro').append('м. ' + obj.routeOptions.metro.name + ' ('+Math.round(obj.getActiveRoute().properties.get('distance').value)+' м)');
});

7 комментариев
Полно способов:

1. через контекст then
2. через замыкание
3. через data bind
dimik,
Да, наверняка способов много. Но я не эксперт в яваскрипте (я бэкендщик) и многих тонкостей не понимаю : (
Тут дело в том, что в моём случае этих вызовов route создаётся несколько разом (идёт цикл по переменной i), поэтому я не могу просто внутри использовать metro[i] (оно при вызове then() будет всегда одинаковым (последним)).
Поэтому мне надо как то в момент создания route "прикрепить" к нему нужную запись metro[i]. И как это сделать я не понимаю.
Ваши варианты все прогуглил, но знаний в яве не хватило, чтобы родить решение.
Напишите, если не сложно, пример любого из способов или киньте ссылку на более-менее понятный мануал.
Dmitry Smirnov,
А что за проект у вас? Можно ссылку увидеть?
dimik,
Нет, он локально у меня лежит только. Суть такая - юзер указывает адрес, яндекс даёт ближайшие метро к этому адресу, дальше я с сервера получаю координаты этих метро по их названиям и считаю пешеходный маршрут к каждому из них. Код выше, собственно, этим и занимается - вычисляет длину пешеходного маршрута между 2 координатами (метро и адресом).
Dmitry Smirnov,
Долбить в цикле в маршрутизатор, это не продакшн решение. Маршрутизатор имеет суточный лимит и даже при небольшой посещаемости вы можете выйти за его рамки.


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


router[i].then(function (obj) {
    $('#additem_metro').append('м. ' + this.name + ' ('+ymaps.formatter.distance(obj.getActiveRoute().properties.get('distance').value)+' )');
}, metro[i]);
dimik,
Спасибо, сработало.
Там метро понадобится только при заполнении профиля, поэтому за лимит не должно выйти. Да и другого решения я не вижу. 
Если упрусь в лимит, сделаю на подстраховке функцию, которая просто расстояние между 2 координатами будет считать по прямой.
Dmitry Smirnov,
Строить маршруты только ради получения расстояния, не отображая их на карте, это нарушение Пользовательского соглашения АПИ.


Используйте функцию расчета расстояния по прямой