1

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

我心想:“好吧,我可以将它用作发布者/订阅者......”

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

我有 3 个复选框:

在此处输入图像描述

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

var t =  $.Deferred();


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


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

done回调只解决一次。

有什么我可以做的,所以这段代码将作为订阅者/发布者运行吗?

注意 我知道还有很多其他的选择deferred。但我的问题具体是关于deferred(可以/不能用作发布/订阅)。

4

1 回答 1

1

当 Deferred 对象被解析时,它的状态被认为是最终的。但你是对的,有一个 pubsub 机制,称为 Deferred.progress。它通常在延迟对象的状态逐渐变化时使用,因此也应该跟踪这些渐变。

您可以使用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小提琴

于 2013-10-01T10:17:51.953 回答