2013-05-25 2 views
1

Я играл с javascript с событиями в последнее время и задавался вопросом, хорошо ли это для объектов, которые слушают их собственные события, как способ абстрагирования и упрощения внутренней логики.Объекты Javascript, слушая их собственные события

Рассмотрим следующий пример:

function MyModule(options) { 
    this.options = options; 
    this.data = {}; 

    this.setListeners(); 
    //... 
} 

MyModule.prototype = new EventEmitter; 
MyModule.prototype.constructor = MyModule; 

MyModule.prototype.updateBasket = function() { 
    var self = this, 
     url = this.options.url; 

    $.ajax(url) 
     .done(function(data) { 
      self.emit('basketupdate:success', data); 
     }) 
     .fail(function(jqxhr, textStatus, err) { 
      self.emit('basketupdate:error', err); 
     }) 
     .complete(function() { 
      self.emit('basketupdate:complete'); 
     }); 
}; 

MyModule.prototype.setListeners = function() { 
    var self = this; 

    this.on('basketupdate:success', function(data) { 
     // ... do something on success 
     self.data = data; 
    }); 

    this.on('basketupdate:success', function(data) { 
     // ... do something else on success 
     console.dir(data); 
    }); 

    this.on('basketupdate:error', function() { 
     // ... do something to handle the error 
    }); 
}; 

var module = new MyModule({ 
    url: '/path/to/request' 
}); 

module.updateBasket(); 

Простой модуль с AJAX запроса. Я мог бы легко поместить всю логику в соответствующий обратный вызов или даже отобразить обратные вызовы во внутренние методы. Однако мне очень нравится такой подход к упрощению кода.

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

+0

Возможно, вам стоит рассмотреть вопрос об этом по адресу http://codereview.stackexchange.com/. Я не вижу потенциальных проблем с этим кодом. Выпуски событий, которые прослушиваются самим модулем и снаружи, выполняются также в нескольких библиотеках jQuery. – migg

+0

Спасибо - я не знал о codereview! Я разместил это там. – leepowell

ответ

0

Вы можете сделать это, но это не очень полезно.

Этот код просто легче читать:

MyModule.prototype.updateBasket = function() { 
    var self = this, 
     url = this.options.url; 

    $.ajax(url) 
     .done(this.done) 
     .fail(this.fail) 
     .complete(this.complete); 
}; 

MyModule.prototype.done = function(data) { 
    // Do something when done 
}; 

MyModule.prototype.fail = function(data) { 
    // Do something when request failed 
}; 

MyModule.prototype.complete = function(data) { 
    // Do something no matter what 
}; 

И вы могли бы дать более значимые имена ваших методов.

Идентификаторы событий полезны, когда вы играете с разными объектами, которые вы не хотите связывать вместе.

+0

Я согласен в этом упрощенном контексте. Но как только объекты становятся все больше и сложнее, тогда такие методы, как 'done', могут обрабатывать разные вещи. Используя слушателей, я могу держать логику более чистой и более разделенной в индивидуальные проблемы - просто играя с идеями. – leepowell

+0

@leepowell, вы все равно будете иметь разных слушателей для разных событий. Использование функций - это путь, если вы хотите чистых, разделенных проблем. В конце концов, они были изобретены. –

Смежные вопросы