集合/数组中的事件

时间:2013-02-07 10:16:57

标签: javascript events

在我的jQuery网络应用程序中,我几乎都在使用事件 我为服务器执行ajax客户端请求(名称为“comm”)的组件有一个队列 此队列类似于Backbone.js集合。

因此,每当我将一个新的请求对象放入“comm”集合时,如果当前存在正在进行的请求,则comm对象将获得“add”事件,而“comm”的“worker”方法则会显示。如果没有人,则worker方法处理请求,最后,当一切正常时,在请求对象上触发“完成”事件。

在此通讯组件中,一次只能有一个请求。如果我将一个请求对象添加到“comm”并且“add”事件被触发并且worker方法看到,那么已经有一个请求,而不是没有任何反应。

我的问题是:在这种情况下,处理这个未经处理的请求对象的最佳方法是什么?对于“事件基础设施”?

到目前为止,我有两种不同的方法:

1)我可以执行以下操作:如果我的持续请求已完成,则worker方法可以检查集合中是否存在未处理的请求对象并对其进行处理。这很简单,没有涉及任何事件。

2)或者其他不同之处:如果工作方法由于“添加”事件而启动,并且看到已经存在持续请求,我可以实现类似:“我无法对此添加事件作出充分响应,我让你回来。请再次在200毫秒内触发自己,也许我有时间。“

也许有人已经遇到类似的问题并且有一个非常好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

我认为解决这个问题的一个好方法是实现在队列中触发的“下一个”事件。每次触发“完成”事件时,它应该触发队列​​上的下一个事件,然后将看到是否有任何未处理的请求,如果是,则根据您的逻辑选择一个(我假设FIFO)

答案 1 :(得分:0)

如果我理解你是正确的,你想链接请求或其他异步事件?然后promises模式是一个优雅的解决方案。

JQuery已经使用Deferred object实现了它。

使用JQuery 1.8+请求链接可以简单:

$.ajax(...).then(
    function() {
        return $.ajax(...);
    }
).then(
    function() {
        return $.ajax(...);
    }
);

但是你也可以围绕它构建一个更加动态和复杂的架构。例如,您可以实现您的队列,使其始终存储最后一个未解析的promise,以便您可以在新的处理程序已经处于活动状态时为其附加新的处理程序。

通用示例:

var Queue = function() {
    // start with resolved promise
    var promise = $.Deferred().resolve();

    this.add = function(handler) {
        // chain and replace latest with next promise
        promise = promise.then(function() {
            var deferred = $.Deferred();
            handler(deferred);
            return deferred;
        }).promise();
    }
};

var q = new Queue();
q.add(function(deferred) {
    setTimeout(function() { alert('handler 1'); deferred.resolve(); }, 1000);
});
q.add(function(deferred) {
    setTimeout(function() { alert('handler 2'); deferred.resolve(); }, 1000);
});

<强> JSFiddle demo

这里处理程序将延迟对象作为参数获取,如果它们“完成”,则负责解析(或拒绝)它。另一个更灵活的可能性是处理程序必须自己创建延迟对象并返回它的承诺,这样你也可以使用其他承诺,比如$ .ajax返回的承诺