1

我最近一直在玩事件驱动的 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 请求的简单模块。我可以很容易地将所有逻辑放在相应的回调中,甚至可以将回调映射到内部方法。但是我非常喜欢这种简化代码的方法。

以我没有考虑过的方式构建代码是否存在缺点或潜在问题。或者这是否会被视为一种反模式,其中事件只打算从其他地方收听?

4

1 回答 1

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
};

你可以给你的方法起更有意义的名字。

当您使用不想链接在一起的不同对象时,事件发射器很有用。

于 2013-05-25T14:00:07.617 回答