在 jQuery 延迟对象中调用 "then" 和 "success" 的顺序

Order of calling "then" and "success" in jQuery deferred objects

我正在通过 $.get 方法加载一些数据。我在 get 调用中使用了成功函数。但我也在使用 when/then 结构。

两个回调都被调用了吗?如果是,哪个先发生,为什么?

$.when(
  $.get("test.html", functionA )
).then( functionB );

如果成功,这是否保证调用functionA,然后functionB?或者是否存在 B 可能发生在 A 之前的情况,或者 functionA 中的某些内容是否会阻止 functionB 被调用?我在 jQuery 文档中找不到答案。

总结: functionA 将比您示例中的 functionB 更早被调用。来自 jQuery.ajax 设置的 successerror 回调(或在您的示例中传递给 $.get)将比附加到返回的 jqxhr 的任何回调更早被调用对象稍后。嗯,今天 :-)

详细信息: jQuery.ajax() 的文档没有提到这一点。如果可以的话,你最好避免依赖它。

只要您使用特定的 jQuery 版本进行开发,您就可以检查其实现并假设它不会改变。如果你升级,你应该检查假设是否仍然有效。

例如,jQuery(1.12.4、2.2.4 和 3.1.1)所有受支持分支中的最新版本注册了 successerror 回调 jQuery.ajax 设置 在调用者获取 jqxhr 对象并可以注册其回调之前 。例如,jqxhr 对象是 Deferred Object which guarantees, that handlers attached to its resolution or rejection are executed in the order of their attaching. You can confirm it in the documentation of deferred.done()。这意味着,来自 jQuery.ajax 设置的 successerror 回调将始终比稍后附加到返回的 jqxhr 对象的任何回调更早调用。

jQuery.ajax 3.1.1 sources:

// Install callbacks on deferreds
completeDeferred.add( s.complete );
jqXHR.done( s.success );
jqXHR.fail( s.error );

我承认,在以后的 jQuery 更新中改变执行顺序的可能性很小。这就是为什么我认为,依赖它会非常稳定。