呼叫顺序"然后"和"成功"在jQuery延迟对象中

时间:2017-01-08 13:43:16

标签: jquery deferred

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

是否会调用这两个回调,如果是,那么首先发生哪些回调?为什么?

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

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

1 个答案:

答案 0 :(得分:3)

摘要functionA将在您的示例中提前调用functionB。来自success设置的errorjQuery.ajax回调(或示例中传递给$.get)将比之前回复jqxhr的回调更早调用对象以后。那么,今天: - )

详细信息jQuery.ajax()的文档未提及此问题。如果可以的话,你最好避免依赖它。

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

例如,jQuery(1.12.4,2.2.4和3.1.1)的所有受支持分支中的最新版本在jQuery.ajax设置之前注册successerror回调调用者获取jqxhr对象并可以注册他们的回调jqxhr对象是Deferred Object,它保证附加到其解析或拒绝的处理程序按其附加顺序执行。例如,您可以在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更新中,更改执行顺序的可能性相当小。这就是为什么我认为,取决于它会非常稳定。