Javascript 什么';定义多个jQuery.Callbacks()先决条件的简单方法是什么?
定义多个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
// 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
处理程序,一个处理程序可以处理实际数据,一个处理程序可能只关心处理程序何时完成,以便您可以显示加载条等。谢谢。刚刚看到你的反应。当我分别得出相同的结论时,将其标记为已回答。正如您所说,使用多个已完成处理程序进行装饰会让人惊叹不已。