什么是定义多个jQuery.Callbacks()先决条件的简单方法?

时间:2011-11-26 19:06:52

标签: javascript jquery

定义多个jQuery.Callbacks()先决条件的最简单方法是什么?

// simple pubsub example
var pubsub=(function() {
    var callbacksObj={};
    return function(id){
        if(!id) throw 'callbacks requires an id';
        return (callbacksObj[id] = callbacksObj[id] || $.Callbacks('unique memory'));
    };
})();
function fn1(){
    console.log('fn1');
};
function fn2(){
    console.log('fn2');
};
function fn3(){
    console.log('fn3');
};

// subscribing
pubsub('foo').add(fn1);
pubsub('bar').add(fn2);
pubsub('foo','bar').add(fn3); // adding a function with multiple dependencies

// publishing
pubsub('foo').fire() // should only log 'fn1';
pubsub('bar').fire() // should log both 'fn2' AND 'fn3' since both have fired

我可以看到将每个添加的函数包装在另一个函数中,该函数检查每个id的fired()状态,尽管这似乎是一个常见的场景,可能有一种我更缺失的简单方法。

1 个答案:

答案 0 :(得分:1)

我认为deferred正是您所寻找的:

http://api.jquery.com/category/deferred-object/

它看起来像这样:

$.when(some_promise).then(some_callback)

你可以:

$.when(some_promise, another_promise).then(some_callback)

在这种情况下,some_callback仅在some_promise another_promise得到解决后才会被调用。

deferred基本上只是为异步函数添加了抽象级别,从而更容易表达依赖项。我想你的例子看起来像是:

// simple pubsub example
var pubsub=(function() {
    var callbacksObj={};
    return function(id){
        if(!id) throw 'callbacks requires an id';
        return some_assynchrnous_function(id); // like $.ajax
    };
})();
function fn1(){
    console.log('fn1');
};
function fn2(){
    console.log('fn2');
};
function fn3(){
    console.log('fn3');
};

// subscribing
var foo = pubusb('foo');    // should return a deferred/promise
var bar = pubsub('bar');

$.when(foo).then(fn1);
$.when(bar).then(fn2);
$.when(foo, bar).then(fn3);

我不完全确定这对jQuery是否正确,但你明白了。我没有发现jQuery API对我来说非常有意义所以我写了自己的:3

我发现能够制作'空'延迟对象,然后将done处理程序附加到它,然后将延迟对象传递给最终将最终解析它的东西是有用的。我不确定jQuery是否可以做到这一点。

起初看起来有点令人生畏,但如果你可以把头包起来,你可以从中获得如此多的惊喜。依赖关系是一个很大的但是范围也很好,你可以在多个级别添加多个done处理程序,一个处理程序可以处理实际数据,一个处理程序可能只是在处理程序完成时感兴趣所以你可以显示一个加载吧等。