使用$ .deferred作为发布者/订阅者?

时间:2013-10-01 10:12:39

标签: javascript jquery jquery-deferred

由于可以解析$.Deferred();对象,并且许多人可以订阅done/always/fail方法 -

我心想:"我可以将它用作发布者/订阅者......"

所以我做了一个简单的测试(JSBIN):

我有3个复选框:

enter image description here

我想在检查所有3个时显示警告:

var t =  $.Deferred();


$(":checkbox").on('click',function (){
    t.resolve("blabla");
});


t.done(function (val)
{
  if($(":checkbox:checked").length==3) alert('ok');
});

done回调只解决了一次。

我能做些什么,这个代码将作为订阅者/发布者?

NB 我知道deferred还有很多其他选择。但我的问题是关于deferred(可以/不能用作pub / sub)。

1 个答案:

答案 0 :(得分:1)

解析Deferred对象后,其状态将被视为已完成。但你是对的,有一个名为Deferred.progress的pubsub机制。当Deferred对象的状态逐渐变化时,通常会使用它,因此也应该跟踪这些渐变。

您可以使用Deferred.progress进行订阅,Deferred.notify(或Deferred.notifyWith,如果您想切换回调的上下文)以进行发布。特别是你的代码可能是这样编写的:

var t =  $.Deferred();
t.progress(function(val) {
  if($(":checkbox:checked").length == 3) alert(val);
});

$(":checkbox").on('click',function (){
    t.notify("blabla");
});

JS Fiddle