Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.10.2013, 10:29
Интересующийся
Отправить личное сообщение для vladimir7517 Посмотреть профиль Найти все сообщения от vladimir7517
 
Регистрация: 05.10.2013
Сообщений: 26

как остановить функцию?
господа имеется скриптик
который каждые 5 секунд берет с сервера координаты и подставляет их в яндекс карту,координаты берутся по id заказа,при нажатии на заказ выплывает div с картой,но проблема в том что я не могу остановить повтор функции и в карту подставляеется 2 , 3 и тюд заказов и карта начинает тупо моргать,подскажите как остановить данный settimeout когда мне нужно запускать функцию по другому заказу?вот сообственно сам код
function view_map(order_id){
    $('#yandex_map').slideToggle();
    //clearTimeout(id);
    YMaps.load();



    (function worker() {

     $.ajax({
            url: 'now-order-taxi-info.php',
            data: 'order_id='+order_id,
            type: 'GET',
            success: function(xml){


                jQuery(xml).find('data').each(
                    function()
                    {   
                        var driver_timecount = jQuery(this).find('DRIVER_TIMECOUNT').text(),
                            car_mark = jQuery(this).find('CAR_MARK').text(),
                            car_color = jQuery(this).find('CAR_COLOR').text(),
                            gosnumber = jQuery(this).find('GOSNUMBER').text(),
                            is_prior = jQuery(this).find('IS_PRIOR').text(),
                            driver_phone = jQuery(this).find('DRIVER_PHONE').text(),
                            crew_coords = jQuery(this).find('CREW_COORDS').text(),
                            order_state = jQuery(this).find('ORDER_STATE').text();  

                            var a = crew_coords.split(/\s*,\s*/);
                            var asd = [a[1].substr(0,7), a[0].substr(0,7)].join(', ');

                            //var coord = "["+asd+"]";

                            //alert(coord);

                            var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0],{behaviors:['default', 'scrollZoom']});

                            // Установка для карты ее центра и масштаба
                            map.setCenter(new YMaps.GeoPoint(a[0].substr(0,7),a[1].substr(0,7)), 18);
                                                        // Создает метку, значок которой не скрывается при открытии балуна
                            var placemark = new YMaps.Placemark(new YMaps.GeoPoint(a[0].substr(0,7),a[1].substr(0,7)), {draggable: 0, style: "default#carIcon"});

                            // Добавляет метку на карту
                            map.addOverlay(placemark);
                           
                                            
                    });
            },
            complete: function() {
              setTimeout(worker, 3000);
            }

        });
    })();
Ответить с цитированием
  #2 (permalink)  
Старый 11.10.2013, 11:04
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от vladimir7517
каждые 5 секунд
Сообщение от vladimir7517
setTimeout(worker, 3000);
5 или 3 ?
какой-то флаг == угу запускаем таймер -- не угу фиг таймер
Ответить с цитированием
  #3 (permalink)  
Старый 11.10.2013, 11:18
Интересующийся
Отправить личное сообщение для vladimir7517 Посмотреть профиль Найти все сообщения от vladimir7517
 
Регистрация: 05.10.2013
Сообщений: 26

Сообщение от рони Посмотреть сообщение
5 или 3 ?
какой-то флаг == угу запускаем таймер -- не угу фиг таймер
ой да,точно 3)) а как именно поставить?как ни ставлю замкнутый круг получается...либо работает как и работало либо вообще не работает((
Ответить с цитированием
  #4 (permalink)  
Старый 11.10.2013, 11:37
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от vladimir7517
а как именно поставить?
А как понять что у тебя пошли действия
Сообщение от vladimir7517
другому заказу
?
Ответить с цитированием
  #5 (permalink)  
Старый 11.10.2013, 11:46
Аватар для mi.rafaylik
Кандидат Javascript-наук
Отправить личное сообщение для mi.rafaylik Посмотреть профиль Найти все сообщения от mi.rafaylik
 
Регистрация: 07.12.2012
Сообщений: 113

vladimir7517, вариант с флагом может выглядеть так:
var workerFlag; // пустой флаг в поле видимости обеих функций
function worker(параметры){ // часть функции, отвечающая за повторный запрос
	workerFlag = 1; // активируем флаг
	$.ajax({
		complete: function() {
			if (workerFlag == 1){ // проверяем флаг
				setTimeout(worker, 3000);
			}
		}
	});
}
$('.openMap').click(function(){ // какое-либо действие/событие, возможно открытие новой карты
	workerFlag = 0; // обнуляем флаг, следующий setTimeout уже не запустит функцию worker
	// дождаться завершения последнего таймаута - не лучшее решение
	// дальнейшие действия - видимо запускаем функцию worker с новыми параметрами
});

Но здесь сталкиваемся с трудностью - если функция вызывает сама себя, setTimeout даёт задержку перед запуском новой функции в случае остановки текущей (чтоб проверить флаг).
Лучше переосмыслить подход. Например, использовать флаг только для остановки повторного запуска функции (возможно закрытие карты), а при каждом запуске функции проверять передаваемые ей параметры. Если нажали открыть другую (следующую) карту, передавать функции worker новые параметры (id нового запроса, какую карту открывать, где открыть). А в setTimeout проверять id запроса.
Почитайте как передать параметры функции, и ещё про deffered.

Последний раз редактировалось mi.rafaylik, 11.10.2013 в 13:31.
Ответить с цитированием
  #6 (permalink)  
Старый 11.10.2013, 11:58
Интересующийся
Отправить личное сообщение для vladimir7517 Посмотреть профиль Найти все сообщения от vladimir7517
 
Регистрация: 05.10.2013
Сообщений: 26

http://i59.fastpic.ru/big/2013/1011/...1ebb18fae1.png
и когда я нажимаю еще на другие кнопки открытия карты скрипт продлжает первый аякс запрос и к нему добавляется еще второй,тоесть функция дублируется и карта соответсвенно перескакивает от одной точки к другой ,как быть то?
Ответить с цитированием
  #7 (permalink)  
Старый 11.10.2013, 12:46
Интересующийся
Отправить личное сообщение для vladimir7517 Посмотреть профиль Найти все сообщения от vladimir7517
 
Регистрация: 05.10.2013
Сообщений: 26

ничего не помогло,какой то бешеный скрипт )))
Ответить с цитированием
  #8 (permalink)  
Старый 11.10.2013, 13:14
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от mi.rafaylik
если функция вызывает сама себя, setTimeout даёт задержку перед запуском новой функции
Это не "вызов функции самой собой"... Твоя анонимная функция просто завершится. А вот setTimeout() таки вызовет ту функцию...
Ответить с цитированием
  #9 (permalink)  
Старый 11.10.2013, 13:14
Интересующийся
Отправить личное сообщение для vladimir7517 Посмотреть профиль Найти все сообщения от vladimir7517
 
Регистрация: 05.10.2013
Сообщений: 26

все заработало помог clearTimeout в нужном месте
и пришлось добавить кнопочку закрыть карту
Ответить с цитированием
  #10 (permalink)  
Старый 11.10.2013, 13:16
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от vladimir7517
когда я нажимаю еще на другие кнопки открытия карты скрипт продлжает первый аякс запрос и к нему добавляется еще второй,тоесть функция дублируется и карта соответсвенно перескакивает от одной точки к другой ,как быть то?
Как вариант, вводить еще один флаг "ИД нужного запроса". Если ajaxный колбек "увидит", что результат не "того ИД" - просто ничего не будет делать...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как назвать функцию? mrtarantul Оффтопик 12 10.08.2013 16:26
как реализовать свою функцию к переменной czp Общие вопросы Javascript 2 01.01.2012 19:52
setInterval как передать переменную в функцию kamushek Общие вопросы Javascript 6 02.09.2011 23:53
как вызвать функцию название которой находиться в строке dark Общие вопросы Javascript 3 14.10.2009 13:02