4

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

例如,我可能会编写一个返回“间隔”对象的方法,如下所示:

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

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

我很想知道这对于 Promise 是否合法,例如进度处理程序可用于多个回调,而完整的处理程序从未使用过,但更重要的是,有一个取消订阅 Promise 的概念。

如果不是这种情况,并且承诺是专门针对这种情况的,那么是否有一个标准化的模式来做我所描述的事情?

4

1 回答 1

2

取消功能可以添加到 Promise 实现中,而不会破坏具有单次触发成功/失败回调的主要范例。

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

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

  • 就绪状态
  • 地位
  • 状态文本
  • 当底层请求分别以 xml 和/或文本响应时的 responseXML 和/或 responseText
  • setRequestHeader(name, value) 通过用新值替换旧值而不是将新值连接到旧值而偏离标准
  • getAllResponseHeaders()
  • 获取响应头()
  • 中止()

您可以编写一个setTimeout包装器,该包装器公开一个承诺接口以及一个额外的取消方法。

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


更新(基于评论中的讨论):

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

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

于 2011-09-28T20:25:11.963 回答