pipe() 和 then() 文档与 jQuery 1.8 中的现实

pipe() and then() documentation vs reality in jQuery 1.8

本文关键字:then 文档 pipe jQuery      更新时间:2023-09-26

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

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

来自jQuery源代码:

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

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

then()的描述 :

说明:添加解析或拒绝延迟对象时要调用的处理程序。

pipe()的描述:

说明:用于筛选和/或链接延迟的实用工具方法。

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

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

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

更新

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

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

也许它只是模糊的,但它暗示它返回你调用then()进行链接的延迟对象,而实际上它返回一个全新的对象......

再次更新

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

jQuery 1.8 的文档更新尚未联机。

根据最近的这篇博文:

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

更新:是的,then()返回一个新Deferred,因为它等效于现在pipe()。我很有信心文档更新很快就会澄清这一点。

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

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

对于 then():

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

[...]

从 jQuery 1.8 开始deferred.then() 方法返回一个新的承诺,该承诺可以通过 函数,替换现已弃用的 deferred.pipe() 方法。这 doneFilterfailFilter函数过滤原始延迟的 已解决/已拒绝状态和值。progressFilter函数 过滤对原始延期notifynotifyWith的任何调用 方法。这些过滤器函数可以返回要传递的新值 以及承诺的.done().fail()回调,或者他们可以 返回另一个可观察对象(延迟、承诺等),它将 将其已解决/已拒绝状态和值传递给承诺的 回调。如果使用的过滤器函数为 null 或未指定, 承诺将使用与 源语言。