对.then()方法进行了重大更改。尤其是,在.then()回调中抛出的任何异常现在都被捕获并转换为 rejection(拒绝) 值,并且从rejection(拒绝)处理程序返回的任何 non-thenable 值都会变为 fulfillment 值。我们强烈建议您在 promise 链的末尾添加一个.catch()方法(3.0中新增),以避免出现难以调试的问题。您可能会遇到这种新行为,最可能的地方是使用由jQuery.ajax()生成的 Deferred,因为返回的jQXHR对象是jQuery.Deferred的超集。
在jQuery 1.x和2.x中,回调函数中的未捕获异常会停止代码执行。抛出的异常会冒泡直到它在try/catch中被捕获,或冒泡到window并通过 window.onerror触发。
例如,考虑下面这个代码使用 Promises/A+ 新标准的行为:
$.ajax("/status") .then(function(data) { whoops(); // 控制台显示:"jQuery.Deferred exception: whoops is not a function" // 在这个函数中没有代码会继续执行 }) .catch(function(arg) { // 此代码在上面的错误之后执行 // arg 是一个 Error 对象, "whoops is not a function" });将其与旧版本的Deferred方法进行比较:
$.ajax("/status") .done(function(data) { whoops(); // 控制台显示: "whoops is not a function" // 在这个函数中没有代码会继续执行 }) .fail(function(arg) { // 此代码不执行,因为异常未捕获 });注意,当在一个Deferred和JavaScript异常发生时,jQuery会向控制台记录一条消息。这些消息采用jQuery.Deferred exception: (error message)形式。如果你不希望控制台输出任何这样的异常,请将jQuery.Deferred.exceptionHook设置为undefined。如果您需要通过这种方式进一步找到或者报告错误的帮助,请在开发期间使用jquery-deferred-reporter插件来获取堆栈跟踪。
https://github.com/jquery/jquery/issues/2736
Callback invocationPromises / A +规范说, promises 总是使用单个值来解析,并且处理程序不在this上下文中调用,而jQuery Deferreds有时会将 上下文 和/或多个值传递给它们的处理程序。但在大多数情况下,第一个参数是这些值中最重要的。如果你将其他Promises/A+实现与jQuery混合使用,那么您只能在处理程序中接收到单个参数。为了保持现有代码的完全兼容性,建议只使用jQuery Deferred 并切换到较旧的.done() 和 .fail()方法,因为他们保留所有向后兼容的行为:
// 典型的 .then() 旧用法,不兼容Promises/A+ $.ajax("url").then( // success function( data, textStatus, jqXHR ) { /* code */ }, // error function( jqXHR, textStatus, errorThrown ) { /* code */ } ); // 这样重写,以便保持先前的行为 $.ajax("url") // success .done(function( data, textStatus, jqXHR ) { /* code */ }) // error .fail(function( jqXHR, textStatus, errorThrown ) { /* code */ });另一种符合Promises/A+规范的行为变更是,Deferred .then()回调总是异步调用。以前,如果将 .then()回调添加到已经 resolved 或 rejected 的 Deferred 上,该回调将立即并同步运行。
向下兼容性Deferred 的方法(如.done(), .fail(), 和 .pipe() )保留了以前的行为,因此不兼容 Promises/A+ 。如果需要同步 resolution,不希望将异常转换为 rejection 值,或者 rejection 回调返回转换为fulfillment值,或者想要抛出的错误冒泡到触发函数的外部,您可以使用这些方法,而不是.then()和.catch()。
更改和功能:jQuery.when()的参数jQuery.when现在能给解析then方法输入的任何参数,作为Promise兼容的“”。这允许更大范围的输入,包括原生的ES6 Promises和Bluebird promises。
此外,现在可以更清楚的识别,多参数调用jQuery.when和单参数或无参数调用之间的区别。多参数调用的行为类似于Promise.all,将 fulfillment 值聚合到 fulfillment 数组中(具有jQuery特有的增强功能,也集合 fulfillment 上下文和支持多值的fulfillments),或者拒收第一个rejection值。单参数和无参数调用的行为类似于Promise.resolve,返回一个Deferred,相同地解析为 thenable 或 类似 Promise-like 输入,或满足其 non-Promise 输入(如适用)。从jQuery 3.0开始,这两个都返回一个新的Deferred(以前版本在使用单个Deferred输入调用时,不会创建新的Deferred)。
https://github.com/jquery/jquery/issues/2018
https://github.com/jquery/jquery/issues/2546
https://github.com/jquery/jquery/issues/3029
更改:jQuery.when() 的进度通知从jQuery 3.0开始,jQuery.when() 方法不再传递进度通知从输入Deferred到输出Deferred。进度消息不是 Promises/A+ 规范的一部分,并且jQuery.when()中进度通知的行为之前就没有出现在jQuery API文档中。
https://github.com/jquery/jquery/issues/2710
尺寸大小 更改: .width(), .height(), .css(“width”), 和 .css(“height”)能够返回非整数值在3.0版之前,jQuery使用DOM的offsetWidth和offsetHeight属性来确定元素的尺寸大小(宽高),并且这些属性总是返回整数。使用jQuery 3.0,我们通过DOM getBoundingClientRect API来获得更精确的值,并且这些值可以不是整数。如果你的代码总是期望尺寸大小(宽高)为整数,它可能需要调整处理返回值的精度。
https://github.com/jquery/jquery/issues/1724
更改: window上的.outerWidth() 或 .outerHeight() 包含滚动条的宽/高