Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Определить выполнение функции (https://javascript.ru/forum/events/2714-opredelit-vypolnenie-funkcii.html)

BAnder 03.02.2009 14:18

Определить выполнение функции
 
Сабж. Как? Интересуют как именованные, так и функции типа setTimeout

ZoNT 03.02.2009 14:24

что определить?

BAnder 03.02.2009 14:33

Ну вот есть функция. К примеру
function foo(){
и тут какой-то код
}

или
setTimeout("foo()",10000);

Как мне определить, работает ли данная функция в текущий момент времени (например, при нажатии на кнопку) или нет?

ZoNT 03.02.2009 14:37

поставить в ней трейс.

BAnder 03.02.2009 14:40

ZoNT,
а можно поподробней?
мои знания в javascript скудноваты...:confused:

ZoNT 03.02.2009 14:41

function foo(){
alert('Йа выполняюсь!')
}

ZoNT 03.02.2009 14:43

function foo(){
var t = setInterval(function(){
  if(button.pressed)alert('Йа выполняюсь!');
},30);

и тут какой-то код

clearInterval(t);
}


Соответсвенно, эта кнопка при нажатии должна ставить себе свойство pressed = true.

BAnder 03.02.2009 14:45

ZoNT,
а если применительно к setTimeout? Как вычислить этот "режим ожидания"?

ZoNT 03.02.2009 14:45

какой ещё "режим ожидания"?

BAnder 03.02.2009 14:49

setTimeout("foo()",10000);

вторым аргументом стоит время до выполнения функции. Вот меня и интересует как определить промежуток времени от назначения setTimeout до выполнения функции, в нем указанной.

ZoNT 03.02.2009 14:52

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

Zibba 03.02.2009 14:54

Этот промежуток будет 10 секунд =) или Вы имеете ввиду не начало выполнения функции а конец ее выполнения!? Заведите переменную и при помощи объекта Date присвойте текущщее время, после выполнения функции (в конце функции foo()) вставьте аналогичное определение текущего времени, разница между date1 и date2 и покажет вам время выполнения.

Дополнение: Уже ответили :) пока я писал

Андрей Параничев 03.02.2009 16:09

BAnder,
Кстати, на всякий случай, чтоб исключить возможность недопонимания: JavaScript - однопоточный язык, обработчики событий и "отложенные" функции выполняются, встраиваясь в общий поток в нужное время (по событию, либо по таймеру).

BAnder 03.02.2009 17:31

Всем спасибо за помощь, но раз такие дела...
Чувствую, что своими силами решить проблему не получится.
Значит так, есть div, при нажатие на который должна происходить анимация (для простоты пусть будет в одной оси из точки 20 в точку 300). Я это реализовываю через setTimeout. Проблема в том, что если после начала анимации нажать на кнопку еще раз, то ее скорость (анимации) пропорционально увеличивается. Вот это я и хотел предотвратить. Кто что может посоветовать по данной проблеме?

Zibba 03.02.2009 17:39

Используйте setInterval(); Либо завежите в самой функции флаг который будет показывать работает сейчас анимация или нет!? И соответственно отрабатывать тело функции еще раз или нет.

x-yuri 03.02.2009 17:45

если одна функция обрабатывает click, а вторая (animate) занимается анимацией, то в обработчике - проверять animate.isRunning и если false то запускать анимацию и animate.isRunning=true. А перед clearInterval - animate.isRunning=false

Kolyaj 03.02.2009 17:53

Тут в первую очередь нужно ответить на важный вопрос "А что должно происходить при нажатии на кнопку во время анимации?". Все почему-то забывают про эту деталь. Попробуйте быстро покликать по контролам на сайтах с анимацией, иногда забавные вещи творятся. Если ничего не должно происходить, то просто выставляйте кнопке disable на время анимации.

BAnder 03.02.2009 18:30

Я это делаю рекурсивной функцией, поэтому флаги и переменные не подходят...
А вот вариант Kolyaj, интересный, нужно опробовать

ЗЫ. у функции кроме анимации никакого предназначения нет.

x-yuri 03.02.2009 18:34

Цитата:

Я это делаю рекурсивной функцией, поэтому флаги и переменные не подходят...
а рекурсия тут при чем? Она тут не нужна имхо
но disable'ить в любом случае стоит, просто если это не кнопка, то избежать проверки в обработчике не получится

BAnder 03.02.2009 18:44

x-yuri,
ну если конечная координата не соответствует, то мы с определенным интервалом (setTimeout) запускаем текущую функцию перемещения блока.
Или я в чем-то не прав?
x-yuri,
вариант с isRunning - я так понимаю (помня пост Андрей Параничев-а об однопоточности) эта фича работает только внутри функции?

x-yuri 03.02.2009 18:49

setTimeout - не рекурсия
isRunning - переменная, которая хранится в функции

BAnder 03.02.2009 19:15

x-yuri,
а я-то думал - это возможности javascript :)
function foo(){
code
setTimeout("foo()",1000);
}

Я знаю, что setTimeout не рекурсия, но разве код выше не рекурсия?

x-yuri 03.02.2009 19:18

нет, потому что foo вызывается через 1 сек (да в любом случае, после завершения предыдущего выполения) с пустым стеком вызовов

BAnder 03.02.2009 20:52

Цитата:

с пустым стеком вызовов
Что за стек? Раньше не слышал. можно объяснить, пример набросать или ссылкой кинуть?

x-yuri 03.02.2009 20:58

Цитата:

Что за стек?
стек вызовов функций, есть в любом отладчике
суть в том, что foo не вызывает сама себя, начиная со второго раза ее вызывает система (браузер)
а первый вызов происходит как результат возникновения события, либо из обработчика вызывается (не знаю как у тебя реализовано)


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