JQuery / Javascript получать уведомления при выполнении функции - PullRequest
2 голосов
/ 03 марта 2012
var f = function() {
    // Do something useful here
};

Есть ли способ «наблюдать» за этой функцией и получать уведомления о ее выполнении? Что-то похожее на bind в jQuery, но я хочу bind функций, а не событий dom?

Я не хочу что-то вроде этого:

var f = function() {
    // Do something useful here
    notifyObserver();
};

но Я хочу как-то так:

f.bind(function() {
    alert('F was executed.');
});

1 Ответ

6 голосов
/ 03 марта 2012

Вы можете заменить f на функцию, которая вызывает notifyObserver:

f = (function(oldF){
      return function(){
        notifyObserver(); 
        oldF(); 
      }; 
    })(f);

Таким образом, вам не нужно изменять (старый) сам f.Конечно, это не включает ваши bind функции.Я бы, вероятно, создал для этого некоторый класс менеджера, в котором вы можете зарегистрировать обработчики событий

manager.bind('f', function(){...});

И создание функции-оболочки будет выглядеть более похоже на

f = (function(oldF){
      return function(){
        manager.notify('f');
        oldF(); 
      }; 
    })(f);

Вы можете обобщить созданиеиз оболочки:

function wrap(methodToWrap, eventName){
    return function(){
        manager.notify(eventName);
        return methodToWrap.apply(this, arguments);
    }
}

(Это работает с любым количеством аргументов и возвращаемых значений!)

А затем выполните что-то вроде:

f = wrap(f, "f");

См .: http://jsfiddle.net/NBefc/2/ (обновлено, нет с возвращаемыми значениями)

...