Лучшая практика для повторения функций обратного вызова?
В моем коде я использую много (именованных) функций обратного вызова, просто чтобы дать быстрый пример:
function showThis(callback) {
// Do something
if (callback && typeof(callback) === 'function') {
callback();
}
}
Теперь я повторяю этот шаблон для разных функций (я говорю о части обратного вызова), поэтому считается ли это лучше, если я сделаю одну универсальную функцию обработчика обратного вызова и включу ее?
Что-то вроде:
function doCallback(callback) {
if (callback && typeof(callback) === 'function') {
callback();
}
}
function showThis(callback) {
// Do something
doCallback(callback);
}
Я думаю, что лучше хранить код СУХИМ, но я не уверен. Любая помощь очень ценится!
2 ответа
На мой взгляд, необязательно иметь обработчик обратного вызова. В разных ситуациях вам может понадобиться вызвать обратный вызов в другом контексте (например, callback.call(ob...
или же callback.apply(obj...
). Поэтому вам понадобится дополнительный параметр обработчика обратного вызова (контекст). Еще одна вещь, которая не очень приятна, это то, что вам может потребоваться передать пользовательские аргументы в обратный вызов. С помощью обработчика обратного вызова вы можете уменьшить боль, передав все параметры в массив и применив к ним функцию. Что-то вроде...:
function callbackHandler(callback, arguments, context) {
if (typeof callback === 'function') {
return callback.apply(context, arguments);
}
return null;
}
Но есть так много необязательных параметров... Другая вещь - это проверка, которую вы делаете:
if (callback && typeof callback === 'function') //notice that typeof is an operator not a function, so you don't need parentless
на самом деле не нужно, этого достаточно: typeof callback === 'function'
Первое условие вернется false
только если callback
оценивается в false
но если он оценивается в false
typeof callback
не вернусь function
, Так что условие достаточно короткое.
Вот почему я думаю, что вам не нужен обработчик обратного вызова. И, кстати, хороший вопрос, я люблю такие темы!:-)
Да, это может быть хорошей идеей. Как вы сказали, он избегает повторения, и это совершенно ясно относительно его намерений. В то время как вы теряете доступ к переменным, которые были в showThis
сфера, вы все равно теряли это, потому что callback
не был определен там, так что не о чем беспокоиться.