最佳答案
JQuery 的 Deferred
有两个函数可以用来实现函数的异步链接:
then()
deferred.then( doneCallbacks, failCallbacks ) Returns: Deferred
解析 Deferred 时调用的函数或函数数组。
当延迟被拒绝时调用的函数或函数数组。
pipe()
deferred.pipe( [doneFilter] [, failFilter] ) Returns: Promise
DoneFilter 解析 Deferred 时调用的可选函数。
FailFilter 在拒绝延迟时调用的可选函数。
我知道 then()
比 pipe()
存在的时间要长一些,所以后者必须增加一些额外的好处,但是差别究竟是什么使我迷惑不解。两个回调参数几乎相同,尽管名称不同,返回 Deferred
和返回 Promise
之间的差异似乎很小。
我一遍又一遍地阅读官方文档,但总是发现它们太“密集”,以至于我无法真正理解它们。我在搜索中发现了很多关于这个或那个功能的讨论,但是我没有发现任何东西能够真正澄清每个功能的优缺点。
那么什么时候使用 then
更好,什么时候使用 pipe
更好呢?
Felix 出色的回答 确实有助于阐明这两种功能的区别。但是我想知道是否有时候 then()
的功能比 pipe()
的更好。
很明显,pipe()
比 then()
更强大,似乎前者能做后者能做的任何事情。使用 then()
的一个原因可能是它的名称反映了它作为处理相同数据的函数链的终止的角色。
但是,是否有一个用例需要 then()
返回原来的 Deferred
,而 pipe()
不能这样做,因为它返回一个新的 Promise
?