Клуб API Карт

остановить асинхронное выполнение программы 2.0

alesha.krivorotoff
9 января 2014, 21:57

выполняю вот такой код: ymaps.route([[55.7689, 37.8072], [55.8307, 38.3057]]).then(function (route)){'код'},  {function (error) {'код'});. который должен вирнуть путь(дорогу). Но возникла задача где необходимо выполнение этого кода прирвать. Тоесть прирвать запрос к серверу. Тоесть если мы сделали запрос на нахождение пути, а потом у нас планы изменились и нам этот путь не нужен. Как мне сделать чтобы часть .then не выполнилась "если у меня потребность в этой дороге пропадет". тоесть до того момента когда еще не начала выполняится часть .then "нам сбрело в голову" что дорога ненужна и мы решили не выполнять часть then. Как нан прервать програмно? Ну если мы неуспели среагировать и then выполнилась, ничего страшного. 

КАК ПРЕРВАТЬ ПРОГРАММНО ПРИ ВОЗНИКНОВЕНИИ ПОТРЕБНОСТИ(СОБЫТИЯ).

16 комментариев
Всеволод Шмыров
10 января 2014, 10:19
Доброе утро!
ymaps.route возвращает объект-обещание (util.Promise). Интерфейсно операцию нельзя прервать. Лучшим решением в данном случае будет в callback'е проверять актуальность запроса.

http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/util.Promise.xml
alesha.krivorotoff
10 января 2014, 11:16

непонел если честно. Что такое callback'е. если вы имеете ввиду проверку в части then то это неполностью решает возникшую перед мной задачу. А если вы имели в виду чтото другое пожалусто поясните. По поводу ссылки я несовсем разабрался. Вот какие моменты:  в коде 

promise.then(function (res) {return res + 1; })

 .then(function (res) { a = res; }) 
.then(function (res) { b = res; return 3; }),
 .then(function (res) { c = res; }); 
promise.then(function (res) { d = res; });
как я конимаю происходит инициализация функций-обработчиков которые выполнятся асинхронно. но почему promise два раза инициализируется? и еще зачем в конце третий строчки в данной вырезке запятая, капую роль она выполняет.
Всеволод Шмыров
10 января 2014, 11:33
callback - это функция, которая исполняется по определенному событию. В then передается два callback'а на успех и на ошибку соответственно. В callback можно реализовать любую логику. К примеру, проверку актуальности запроса. Самый примитивный способ - глобальный счетчик. При вызове ymaps.route он увеличивается, а в локальную переменную сохраняется его текущее значение. В success-callback сверяется сохраненное значение и текущее значение глобального счетчика. Счетчик увеличивается и при отмене ожидания асинхронного запроса.

>> еще зачем в конце третий строчки в данной вырезке запятая, капую роль она выполняет.
Запятая - это опечатка. Спасибо, поправим.
>> но почему promise два раза инициализируется?
два раза вызывается переменная promise.
alesha.krivorotoff
10 января 2014, 12:24

про это решение я сам думал но оно "слишком некрасивое". И еще я незнаю как себя поведет локальная переменная. По моему если я попробую вторично построить дорогу в тот момент когда еще запрос на первую дорогу не пришол, локальная переменная инициализируется на вторую дорогу, а когда придет ответ с запроса на первую дорогу сверятся будет не со старым значением локальной переменнной а по моему со сновым значением. А это преведет к "краху". 

вызов асинхроннах функций производиться строчкой (как я понимаю ) promise.resolve(1);.тоесть вызов функций-обработчиков. 

навешивание функций-обработчиков(как я понимаю):

promise.then(function (res) {return res + 1; })

 .then(function (res) { a = res; }) 
.then(function (res) { b = res; return 3; })
 .then(function (res) { c = res; }); 
promise.then(function (res) { d = res; });

но что там можно навешать массив функций-обработчиков????

 

там есть процедура reject ей можно прирвать слушание. как я понимаю .прервать ожидание прихода с сервера запроса. можно ли както свезать ее с ymaps.route. 

Всеволод Шмыров
10 января 2014, 13:08
.прервать ожидание прихода с сервера запроса. можно ли както свезать ее с ymaps.route

ymaps.route возвращает util.Promise.
reject и используется для прерывания. Но это плохой стиль программирования - вызывать прерывание промиса не объектом, который его породил.
В jQuery для предотвращения такого ввели deferred object.
http://api.jquery.com/deferred.done/#deferred-done1

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

Вам необходимо прочитать http://habrahabr.ru/post/78991/

alesha.krivorotoff
10 января 2014, 14:14

Вот посмотрите код:

    Примеры. Свойства события. Координаты щелчка

   

   

   

   

По вашему сколько дорог будет построено?

 Как код компактней вставить в сообщение?

Всеволод Шмыров
10 января 2014, 14:20

У вас LocalPer  в той же области видимости, что и GlobalPer. Видимость переменных в JS определяется не на уровне блоков, а на уровне функций. 

http://habrahabr.ru/post/127482/

Всеволод Шмыров
10 января 2014, 14:23

Для создания локальной переменной создайте замыкание. 

alesha.krivorotoff
10 января 2014, 14:46

что такое замукание - это относятся к JS или к API карте?

Всеволод Шмыров
10 января 2014, 14:57

К JS

alesha.krivorotoff
10 января 2014, 14:45

укажите куда мне поставить LocalPer. Чтобы если сробатывает вторая итерация то первая дорога не строится ..В том случае если первая дорога не успела построится

Всеволод Шмыров
10 января 2014, 15:01
Поместите создание LocalPer, вызов ymaps.route и проверку в функцию, которая будет видеть GlobalPer и вызывайте её в цикле.
alesha.krivorotoff
10 января 2014, 15:23

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

Ваша задача довольно легко решается средствами языка JavaScript и в целом не имеет отношение к функциональности АПИ.

Поэтому пока вы не прочитается про базовые конструкции языка, мы не сможем вам ничем помочь, кроме как написать за вас весь проект.

Вам надо просто хранить, например, в хэше, ссылки на активные маршруты и в обработчике построения маршрута смотреть - актуален текущий маршрут или уже отменен вами.

Всеволод Шмыров
10 января 2014, 16:34
ну как-то так

for (i=1; i    GlobalPer++;
    callRoute();
};

function callRoute () {
    var LocalPer = GlobalPer; //инициализируем и создаем локальную переменную
    a++; b++; c++; d++;   // изменяем координаты для получения другой дороги
    ymaps.route([[a, b], [c, d]], {mapStateAutoApply: false}).then(function (route) {
        if (LocalPer == GlobalPer) {     //проверяем
            myMap.geoObjects.add(route);
        }
    });
}
alesha.krivorotoff
10 января 2014, 16:58

Я думал такой фокус не пройдет. спасибо.