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

Javascript 什么';定义多个jQuery.Callbacks()先决条件的简单方法是什么?,javascript,jquery,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] || $.Callbac

定义多个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()状态的函数中,尽管这似乎是一个非常常见的场景,可能我缺少了一个更简单的方法。

我认为
延迟
是您要找的:

看起来是这样的:

$。当(一些承诺)。然后(一些回调)

你可以有:

$。当(一些承诺,另一个承诺)。然后(一些回调)

在这种情况下,只有在解决了
一些承诺
另一个承诺
的情况下,才会调用
一些回调

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是否正确,但您已经明白了。我觉得jQueryAPI对我来说没有多大意义,所以我写了自己的:3

我发现,能够创建“空”延迟对象,然后将
done
处理程序附加到它,然后将延迟对象传递给最终将解决它的对象是很有用的。我不确定jQuery是否能做到这一点


一开始它可能看起来有点吓人,但如果你能把你的头绕在它周围,你会从中得到很多令人敬畏的东西。依赖关系很大,但范围界定也很重要,您可以在多个级别上添加多个
done
处理程序,一个处理程序可以处理实际数据,一个处理程序可能只关心处理程序何时完成,以便您可以显示加载条等。

谢谢。刚刚看到你的反应。当我分别得出相同的结论时,将其标记为已回答。正如您所说,使用多个已完成处理程序进行装饰会让人惊叹不已。