Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   как остановить функцию? (https://javascript.ru/forum/jquery/42068-kak-ostanovit-funkciyu.html)

vladimir7517 11.10.2013 10:29

как остановить функцию?
 
господа имеется скриптик
который каждые 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);
            }

        });
    })();

рони 11.10.2013 11:04

Цитата:

Сообщение от vladimir7517
каждые 5 секунд

Цитата:

Сообщение от vladimir7517
setTimeout(worker, 3000);

5 или 3 ?
какой-то флаг == угу запускаем таймер -- не угу фиг таймер

vladimir7517 11.10.2013 11:18

Цитата:

Сообщение от рони (Сообщение 275879)
5 или 3 ?
какой-то флаг == угу запускаем таймер -- не угу фиг таймер

ой да,точно 3)) а как именно поставить?как ни ставлю замкнутый круг получается...либо работает как и работало либо вообще не работает((:(

ksa 11.10.2013 11:37

Цитата:

Сообщение от vladimir7517
а как именно поставить?

А как понять что у тебя пошли действия
Цитата:

Сообщение от vladimir7517
другому заказу

?

mi.rafaylik 11.10.2013 11:46

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.

vladimir7517 11.10.2013 11:58

http://i59.fastpic.ru/big/2013/1011/...1ebb18fae1.png
и когда я нажимаю еще на другие кнопки открытия карты скрипт продлжает первый аякс запрос и к нему добавляется еще второй,тоесть функция дублируется и карта соответсвенно перескакивает от одной точки к другой ,как быть то?

vladimir7517 11.10.2013 12:46

ничего не помогло,какой то бешеный скрипт:-E )))

ksa 11.10.2013 13:14

Цитата:

Сообщение от mi.rafaylik
если функция вызывает сама себя, setTimeout даёт задержку перед запуском новой функции

Это не "вызов функции самой собой"... :) Твоя анонимная функция просто завершится. А вот setTimeout() таки вызовет ту функцию...

vladimir7517 11.10.2013 13:14

все заработало помог clearTimeout в нужном месте
и пришлось добавить кнопочку закрыть карту

ksa 11.10.2013 13:16

Цитата:

Сообщение от vladimir7517
когда я нажимаю еще на другие кнопки открытия карты скрипт продлжает первый аякс запрос и к нему добавляется еще второй,тоесть функция дублируется и карта соответсвенно перескакивает от одной точки к другой ,как быть то?

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


Часовой пояс GMT +3, время: 23:07.