[英]Javascript objects listening to their own events
最近,我一直在使用事件驱动的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请求的简单模块。 我可以很容易地将所有逻辑放在相应的回调中,甚至可以将回调映射到内部方法。 但是,我非常喜欢这种简化代码的方法。
以我未曾考虑的方式来构造代码是否存在弊端或潜在问题。 还是将其视为仅旨在从其他地方收听的事件的反模式?
您可以这样做,但这并不是真正有用。
这段代码更容易阅读:
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
};
您可以为您的方法命名更有意义。
当您使用不想链接在一起的不同对象时,事件发射器很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.