# jQuery.when()

所属分类：核心 API | 延迟对象 英文文档：jQuery.when()

## jQuery.when( deferreds )返回: Promise

描述: 提供一种方法来执行一个或多个对象的回调函数， Deferred(延迟)对象通常表示异步事件。

- #### 添加的版本: 1.5jQuery.when( deferreds )

  - deferreds
    类型: Deferred
    一个或多个延迟对象，或者普通的JavaScript对象。

如果向 `jQuery.when` 传入一个延迟对象，那么会返回它的 Promise 对象(延迟方法的一个子集)。可以继续绑定 Promise 对象的其它方法，例如， `defered.then` 。当延迟对象已经被受理（resolved）或被拒绝(rejected）（通常是由创建延迟对象的最初代码执行的），那么就会调用适当的回调函数。例如，由 `jQuery.ajax` 返回的 jqXHR 对象是一个延迟对象，可以向下面这样使用：

1 2 3 |
    $.when( $.ajax("test.aspx") ).then(function(data, textStatus, jqXHR){     alert( jqXHR.status ); // alerts 200});

如果一个参数被传递给`jQuery.when` ， 那么它会被当作是一个被受理（resolved）的延迟对象，并且添加到上面的任何 doneCallbacks 都会被立刻执行。向 doneCallbacks 中传入的是原始的参数。在这种情况下，设定的任何 failCallbacks 永远都不会被执行，因为延迟对象永远不会被拒绝（rejected）。例如：

1 2 3 |
    $.when( { testing: 123 } ).done(    function(x) { alert(x.testing); } /* alerts "123" */    );

在案例中有多个延迟对象传递给`jQuery.when` ，该方法返回一个新的“宿主”延迟对象，跟踪所有已通过Deferreds聚集状态。 当所有的延迟对象被受理（resolve）时，该方法才会受理它的 master 延迟对象。当其中有一个延迟对象被拒绝（rejected）时，该方法就会拒绝它的 master 延迟对象。如果 master 延迟对象被受理（resolved），那么会传入所有延迟对象的受理（resolved）值，这些延迟对象指的就是传给 `jQuery.when` 的参数。例如，当延迟对象是 `jQuery.ajax()` 请求，那么传入的受理（resolved）参数就是请求用的 jqXHR 对象，传入顺序就是它们在参数列表中的顺序。

在多延迟情况下，如果延迟一被拒绝，`jQuery.when`触发立即调用 master 延迟对象的 failCallbacks。请注意，在上述情况中，有一些延迟对象依然是不能被受理（unresolved）的。那么，在这种情况下，如果需要执行一些额外的处理，例如，取消所有未完成的 ajax 请求，你可以在闭包中进行保持 jqXHR 对象的引用，并且在 failCallback 中检查或取消它们。

## 例子:

#### Example: 执行Ajax请求后两个函数是成功的。（见jQuery.ajax()对于一个成功的和错误的案件为AJAX请求的完整描述文档）。

1 2 3 4 5 6 7 8 |
    $.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1,  a2){  /* a1 and a2 are arguments resolved for the      page1 and page2 ajax requests, respectively */  var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */  if ( /Whip It/.test(jqXHR.responseText) ) {    alert("First page has 'Whip It' somewhere.");  }});

#### Example: 执行函数`myFunc`当两个Ajax请求是成功的，如果任一或`myFailure`有一个错误。

1 2 |
    $.when($.ajax("/page1.php"), $.ajax("/page2.php"))  .then(myFunc, myFailure);