Сообщение от 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);