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);