我看到使用 .then()
和 .done()
成功回调之间的区别 . 我知道Eric Hynds提到 .done()
和 .success()
映射到相同的功能,但我猜 .then()
也是如此,因为所有的回调都是在成功操作完成时调用的 .
任何人都可以请你告诉我正确的用法?
非常感谢
我看到使用 .then()
和 .done()
成功回调之间的区别 . 我知道Eric Hynds提到 .done()
和 .success()
映射到相同的功能,但我猜 .then()
也是如此,因为所有的回调都是在成功操作完成时调用的 .
任何人都可以请你告诉我正确的用法?
非常感谢
8 回答
解析延迟时,将触发附加到
done()
的回调 . 当延迟被拒绝时,将触发附加到fail()
的回调 .在jQuery 1.8之前,
then()
只是语法糖:从1.8开始,
then()
是pipe()
的别名并返回一个新的承诺,有关pipe()
的更多信息,请参阅here .success()
和error()
仅在通过调用ajax()
返回的jqXHR
对象上可用 . 它们分别是done()
和fail()
的简单别名:此外,
done()
不仅限于单个回调,并将过滤掉非函数(尽管版本1.8中的字符串存在错误,应在1.8.1中修复):同样适用于
fail()
.处理返回结果的方式也有所不同(称为链接,
done
不链,而then
产生调用链)将记录以下结果:
而
将获得以下内容:
----------更新:
顺便说一句 . 我忘了提一下,如果你返回一个Promise而不是原子类型值,那么外部的promise会等到内部promise继续解析:
通过这种方式,组合并行或顺序异步操作变得非常简单,例如:
上面的代码并行发出两个http请求,从而使请求更快完成,而下面的http请求正在顺序运行,从而减少服务器负载
.done()
只有一个回调,它是成功回调.then()
既有成功也有失败的回调.fail()
只有一个失败回调所以取决于你必须做的事情......如果成功或失败,你会关心吗?
deferred.done()
添加处理程序称为 only when Deferred is resolved . 您可以添加要调用的多个回调 .
你也可以这样写,
deferred.then()
添加处理程序称为 when Deferred is resolved, rejected or still in progress .
实际上存在一个相当重要的区别,因为jQuery的Deferreds意味着是Promises的实现(而jQuery3.0实际上试图将它们引入规范) .
完成/之后的关键区别在于
.done()
总是返回它开头的相同Promise / wrapped值,无论你做什么或返回什么 ..then()
总是返回一个新的Promise,你负责根据你传递的函数控制Promise的内容 .从jQuery转换为本机ES2015 Promises,
.done()
有点像围绕Promise链中的函数实现一个"tap"结构,因为如果链处于"resolve"状态,它会将值传递给函数...但是该函数的结果不会影响链本身 .那些将记录5,而不是6 .
请注意,我使用done和doneWrap来进行日志记录,而不是.then . 那是因为console.log函数实际上并没有返回任何内容 . 如果你通过了会发生什么 . 然后一个不返回任何东西的函数?
那将记录:
发生了什么?当我使用.then并传递一个没有返回任何内容的函数时,它的隐式结果是“未定义”...当然,它返回了一个Promise [undefined]到下一个方法,它记录了undefined . 所以我们开始的原始 Value 基本上已经失去了 .
.then()
本质上是一种函数组合形式:每个步骤的结果用作下一步中函数的参数 . 那个's why .done is best thought of as a 887688 -> it'实际上并不是构图的一部分,只是在某一步骤中偷看某个值并在该值处运行函数,但实际上并没有以任何方式改变构图 .这是一个非常基本的区别,并且可能有一个很好的理由为什么本机Promise没有自己实现的.done方法 . 我们没有必须深入了解为什么没有.fail方法,因为它更复杂(即.fail / .catch不是.done / .then的镜像 - > .catch中的函数返回裸值不“停留”被拒绝,就像传递给那些人一样 . 然后,他们解决了!)
then()
始终意味着无论如何都会调用它 . 但是在不同的jQuery版本中传递的参数是不同的 .在jQuery 1.8之前,
then()
等于done().fail()
. 并且所有回调函数共享相同的参数 .但是从jQuery 1.8开始,
then()
返回一个新的promise,如果它返回一个值,它将被传递给下一个回调功能 .让我们看看以下示例:
在jQuery 1.8之前,答案应该是
所有
result
都需要3.并且then()
函数始终将相同的延迟对象传递给下一个函数 .但是从jQuery 1.8开始,结果应该是:
因为第一个
then()
函数返回一个新的promise,并且值7(这是唯一将传递的参数)传递给下一个done()
,所以第二个done()
写入result = 7
. 第二个then()
将a
的值设为7,并将undefined
作为b
的值,所以第二个then()
返回带有参数NaN的新promise,最后一个done()
打印NaN作为结果 .在响应中有一个非常简单的心理映射,在其他答案中有点难以找到:
done
实现tap
,如bluebird Promisesthen
实现then
,如ES6 Promises.done()
终止了承诺链,确保没有其他任何东西可以附加进一步的步骤 . 这意味着jQuery promise实现可以抛出任何未处理的异常,因为没有人可以使用.fail()
来处理它 .实际上,如果您不打算在承诺中附加更多步骤,则应使用
.done()
. 有关详细信息,请参阅why promises need to be done