Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Событие вызова функции (https://javascript.ru/forum/project/24101-sobytie-vyzova-funkcii.html)

Gvozd 18.12.2011 02:28

Цитата:

Сообщение от FINoM
Не совсем понимаю о чем ты. Кинул исключение, всё остановилось. И что?

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

FINoM 18.12.2011 02:51

Цитата:

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

Так?
window.callEvent = function(func, callback){
		return function(){
			var args = Array.prototype.slice.call(arguments);
			var result;
			try {
				result = func.apply(this, arguments); 
			} catch (e) {
				result = e;
			}
			callback(result, args, this);
			return result;				 
		}
	}


UPD Хотя нет, бред.

FINoM 18.12.2011 02:51

Цитата:

Сообщение от B@rmaley.e><e
В данном случае можно будет только вернуть новую функцию, для которой будет назначен соответствующий обработчик.

Я о том же.

Gvozd 18.12.2011 03:09

Цитата:

Сообщение от FINoM
Так?

не совсем
window.callEvent = function(func, callback){
		return function(){
			var args = Array.prototype.slice.call(arguments);
			var result;
			try {
				result = func.apply(this, arguments); 
			} catch (e) {
				callback(e, args, this);
				throw e;
			}
			callback(result, args, this);
			return result;				 
		}
	}

FINoM 18.12.2011 03:14

Gvozd,
ок, спасибо.

x-yuri 18.12.2011 03:40

(не обновил страницу перед отправкой)

Цитата:

Сообщение от FINoM
Только вот не могу придумать, как это сделать через Function.prototype.

так что ли? Правда непонятно, зачем эти события отлавливать.

Цитата:

Сообщение от Gvozd
а ну-ка, выкинь исключение в наблюдаемой функции))))

а что должно произойти?

FINoM 18.12.2011 05:09

Цитата:

Сообщение от x-yuri
Правда непонятно, зачем эти события отлавливать.

Для дебага. Вот хочешь ты узнать сколько раз была вызвана функция или метод (кстати, может туда добавить счетчик?), какие аргументы были переданы, каков был результат, каков контекст вызова, ловить исключения (спасибо Гвоздю). И при этом ты совершенно не затрагиваешь функцию, которую тестируешь.

Да, и это просто спортивный интерес. Меня полгода назад спросили, можно ли ловить событие вызова какой-нибудь функции, я покрутил пальцем у виска и сказал "нет".

Цитата:

Сообщение от x-yuri
так что ли?

А что оно делает?
Идея в том, что где-то определена функция или метод (даже встроенный, что было продемонстрировано на примере) и ты вешаешь обработчик (псевдообработчик) на её вызов. Я не знаю, как яснее выразиться.

x-yuri 18.12.2011 05:37

Цитата:

Сообщение от FINoM
Для дебага.

для этого есть отладчик (журналирование, в первую очередь)

Цитата:

Сообщение от FINoM
И при этом ты совершенно не затрагиваешь функцию, которую тестируешь.

ради чего усложняем свою жизнь?

Цитата:

Сообщение от FINoM
А что оно делает?

перехватывает событие вызова функции

FINoM 18.12.2011 05:42

Цитата:

Сообщение от x-yuri
перехватывает событие вызова функции

Я ниже вызвал f() и ничего не произошло, кроме, собственно, вызова функции.
Цитата:

Сообщение от x-yuri
ради чего усложняем свою жизнь?

Кто усложняет-то?

B@rmaley.e><e 18.12.2011 12:59

Цитата:

Сообщение от trikadin
Я говорю о том, чтобы при создании ф-ции добавлять к ней коллбек и способ добавления новых коллбеков. Путем сохранения Function в переменную и переопределения его. Вряд ли это реально, но это просто идея.

Ну если один раз обернуть функцию, то в дальнейшем уже можно добавлять события на ту же самую функцию, не создавая новых.
Но как минимум один раз обернуть придётся.


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