Показать сообщение отдельно
  #21 (permalink)  
Старый 27.07.2014, 04:40
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Сообщение от andypop Посмотреть сообщение
RunEndFetch - диспатчит сигнал EndFetch и передает ему имя функции и результат фетча в объект для последующей обработки в хэндлере onEndFetch. Я пишу с большой, чтобы отличить запуск сигнала от других функций. Мне так хочется.
Привет! Имхо, эвенты, хэндлеры, сигналы, слоты — это все какой-то оверинжиниринг. Все делается гораздо, гооораздо проще:

function FunctionNameExtractorFactoryError () {
	this.name = 'FunctionNameExtractorFactoryError';
}

FunctionNameExtractorFactoryError.prototype = Object.create(Error.prototype);

function FunctionNameExtractorFactory () {
	return this;
}

FunctionNameExtractorFactory.buildFunctionNameExtractorInstance = function () {
	return FunctionNameExtractorFactory.commonFunctionNameExtractor;
};

FunctionNameExtractorFactory.commonFunctionNameExtractor = function (fn) {
	if (!fn instanceof Function) {
		throw new TypeError('argument \'fn\' is not instance of Function');
	}

	if (fn.name) {
		return fn.name;
	} else {
		return FunctionNameExtractorFactory.fallbackFunctionNameExtractor(fn);
	}
};

FunctionNameExtractorFactory.fallbackFunctionNameExtractor = function (fn) {
	if (!fn instanceof Function) {
		throw new TypeError('argument \'fn\' is not instance of Function');
	}

	try {
		var source = (fn.toSource || fn.toString).call(fn);
	} catch (e) {
		if (e instanceof TypeError) {
			throw new FunctionNameExtractorFactoryError('Can\'t get function name due unknown malfunction.');
		} else {
			throw e;
		}
	}

	var match = source.match(/function(?:\s+(.*?))?(?=\()/);
	return match ? match[1] : null;
};

FunctionNameExtractorFactory.prototype.buildFunctionNameExtractorInstance = function () {
	return this.constructor.buildFunctionNameExtractorInstance();
};


Вызывать так:
var functionNameExtractorFactory = new FunctionNameExtractorFactory();
var functionNameExtractor = functionNameExtractorFactory.buildFunctionNameExtractorInstance();
functionNameExtractor(arguments.callee);

Последний раз редактировалось ixth, 27.07.2014 в 04:44.
Ответить с цитированием