30

更新:这个问题现在已经过时了,因为文档是准确的并且是最新的。

我一直在探索 jQuery Deferred/Promise API,但我对 jQuery 文档pipe()then()哲学文档之间的差异感到非常困惑。我发现 pipe() 只是 jQuery 1.8 的 then() 的别名。

来自 jQuery 源代码:

// Keep pipe for back-compat
promise.pipe = promise.then;

然而,文档是完全不同的pipe()then()因为它们被认为具有完全不同的用途。

说明then()

描述:添加在解析或拒绝 Deferred 对象时要调用的处理程序。

说明pipe()

描述:过滤和/或链接延迟的实用方法。

我知道从历史上看,它们的行为略有不同,但是在pipe 的整个文档then 的文档中,甚至没有说这两个函数现在做的事情完全相同。

所以,这是我的两部分问题:

  1. 为什么 jQuery 1.8 之间的文档pipe()有所then()不同?
  2. 为什么then()返回一个的延迟对象?这种行为完全没有记录(文档只是说它返回一个 Deferred,而不是它是一个新的)。我知道这样做是有用的(即实现pipe()'s 的所有功能),但从哲学上讲,为什么会这样呢?then()鉴于(附加处理程序)的描述,这是不必要的。

更新

我什至会说这些then()文档具有误导性和不准确:

由于 deferred.then返回延迟对象,延迟对象的其他方法可以链接到这个,包括附加的 .then() 方法。

也许它只是含糊不清,但它意味着它返回您调用then()链接的延迟对象,而实际上它返回一个全新的对象......

再次更新

似乎文档只是错误/过时!所以这回答了为什么文档没有提到它们是同一件事。但是,我的第二个问题仍然存在。原因是简单地then()返回一个的延迟,以便它pipe()可以等效吗?

4

1 回答 1

18

jQuery 1.8 的文档更新尚未上线。

根据最近的这篇博文

我们正在为 1.8 的所有更改更新 API 文档,但现在您可以参考 jQuery 1.8 公告中的更改日志以查看更改的内容。

更新:是的,then()返回一个 newDeferred因为它等同于pipe()now。我非常有信心文档更新将很快澄清这一点。

进一步更新完整性:文档最近更新,现在说pipe()

弃用通知:从 jQuery 1.8 开始,该deferred.pipe()方法已弃用。deferred.then()应该使用替代它的方法。

对于then()

在 jQuery 1.8 之前,参数可以是函数或函数数组。

[...]

从 jQuery 1.8 开始,该deferred.then()方法返回一个新的 Promise,它可以通过函数过滤 deferred 的状态和值,替换现在已弃用的deferred.pipe()方法。doneFilterandfailFilter函数过滤原始 deferred 的已解决/已拒绝状态和值。 该progressFilter函数过滤对原始延迟notifynotifyWith 方法的任何调用。这些过滤器函数可以返回一个新值以传递给Promise.done().fail()回调,或者它们可以返回另一个可观察对象(Deferred、Promise 等),它将其已解决/拒绝状态和值传递给 Promise 的回调。如果使用的过滤器功能是null, 或未指定,promise 将被解析或拒绝,并使用与原始值相同的值。

于 2012-08-17T19:25:09.720 回答