类似于promises / deferred的模式,支持多个结果和取消

时间:2011-09-28 20:02:43

标签: javascript commonjs

类似于promises pattern我正在寻找一个避免需要使用addEventListener / etc方法污染对象的事件模式,我希望能够返回一个可以取消的对象以及'已解决'多次。

例如,我可能会编写一个返回'interval'对象的方法,如下所示:

var ticker = createTicker(1000);
var subscription = ticker.then(function() { console.log('tick') });
... later on ...
subscription.cancel();

这里的主要区别在于,类似于事件标准化的承诺,因此我可以订阅而无需知道事件名称,但是与承诺不同,“完成”可能会多次发生,甚至可能被取消(这将是removeEventListener的等价物。)

我很想知道这是否与promises合法,这样进度处理程序可以用于多个回调,并且完整的处理程序从未使用过,但更重要的是,有一个取消订阅承诺的概念。

如果不是这种情况,并且承诺专门针对这种情况,是否有一种标准化的模式来完成我所描述的内容?

1 个答案:

答案 0 :(得分:2)

取消功能可以添加到promise实现中,而不会破坏单击成功/失败回调的主要范例。

事实上,jQuery已经取消了从jQuery.ajax次调用返回的promise实例:

  

为了向后兼容XMLHttpRequest,jqXHR对象将会   公开以下属性和方法:

     
      
  • readyState的
  •   
  • 状态
  •   
  • 状态文本
  •   当基础请求分别用xml和/或文本响应时,
  • responseXML和/或responseText
  •   
  • setRequestHeader(name,value),它通过将旧值替换为新值而不是将旧值与旧值相连接而不符合标准
  •   
  • getAllResponseHeaders()
  •   
  • getResponseHeader()
  •   
  • 中止()
  •   

您可以编写一个setTimeout包装器,公开promise接口以及其他取消方法。

然而,一旦你进入多火区域,我认为这不是承诺的目的。您必须定义很多关于多次触发将如何与常规承诺功能一起发挥作用的规则和例外。以这种方式使用promises对我来说没有多大意义。


更新(根据评论中的讨论):

这是一个promise“proxy”的示例实现,它允许中止完成/失败回调的进一步中继:

http://jsfiddle.net/atesgoral/qvtqu/