当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


JQuery jQuery.when()用法及代码示例


用法
jQuery.when( deferreds ) => Promise

说明:提供一种基于零个或多个 Thenable 对象执行回调函数的方法,通常延期表示异步事件的对象。

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

如果没有参数传递给 jQuery.when() ,它将返回一个已解决的 Promise。

如果将单个 Deferred 传递给 jQuery.when() ,则该方法将返回其 Promise 对象(Deferred 方法的子集)。可以调用 Promise 对象的其他方法来附加回调,例如 deferred.then 。当 Deferred 被解决或拒绝时,通常是由最初创建 Deferred 的代码,适当的回调将被调用。例如jQuery.ajax()返回的jqXHR对象是Promise-compatible对象,可以这样使用:

$.when( $.ajax( "test.aspx" ) ).then(function( data, textStatus, jqXHR ) {
  alert( jqXHR.status ); // Alerts 200
});

如果将单个参数传递给 jQuery.when() 并且它不是 Deferred 或 Promise,它将被视为已解决的 Deferred,并且任何附加的 doneCallbacks 都将立即执行。 doneCallbacks 传递原始参数。在这种情况下,您可能设置的任何 failCallbacks 都不会被调用,因为 Deferred 永远不会被拒绝。例如:

$.when( { testing: 123 } ).done(function( x ) {
  alert( x.testing ); // Alerts "123"
});

如果您根本不传递任何参数,jQuery.when() 将返回一个已解决的承诺。

$.when().then(function( x ) {
  alert( "I fired immediately" );
});

在将多个 Deferred 对象传递给 jQuery.when() 的情况下,该方法从一个新的 "master" Deferred 对象返回 Promise,该对象跟踪已传递的所有 Deferred 的聚合状态。该方法将在所有 Deferred 解析后立即解析其主 Deferred,或者在其中一个 Deferred 被拒绝时拒绝主 Deferred。如果 master Deferred 已解决,则执行 master Deferred 的 doneCallbacks。传递给 doneCallbacks 的参数提供了每个 Deferred 的解析值,并与 Deferred 传递给 jQuery.when() 的顺序相匹配。例如:

var d1 = $.Deferred();
var d2 = $.Deferred();
 
$.when( d1, d2 ).done(function ( v1, v2 ) {
    console.log( v1 ); // "Fish"
    console.log( v2 ); // "Pizza"
});
 
d1.resolve( "Fish" );
d2.resolve( "Pizza" );

如果 Deferred 在没有值的情况下被解析,则相应的 doneCallback 参数将未定义。如果 Deferred 解析为单个值,则相应的参数将保存该值。在 Deferred 解析为多个值的情况下,相应的参数将是这些值的数组。例如:

var d1 = $.Deferred();
var d2 = $.Deferred();
var d3 = $.Deferred();
 
$.when( d1, d2, d3 ).done(function ( v1, v2, v3 ) {
    console.log( v1 ); // v1 is undefined
    console.log( v2 ); // v2 is "abc"
    console.log( v3 ); // v3 is an array [ 1, 2, 3, 4, 5 ]
});
 
d1.resolve();
d2.resolve( "abc" );
d3.resolve( 1, 2, 3, 4, 5 );

在其中一个 Deferred 被拒绝的 multiple-Deferreds 情况下,jQuery.when() 立即为其主 Deferred 触发 failCallbacks。请注意,此时某些 Deferreds 可能仍未解决。传递给 failCallbacks 的参数与被拒绝的 Deferred 的 failCallback 签名匹配。如果您需要针对这种情况执行额外的处理,例如取消任何未完成的 Ajax 请求,您可以在闭包中保留对底层 jqXHR 对象的引用,并在 failCallback 中检查/取消它们。

例子:

两次ajax请求成功后执行一个函数。 (有关 ajax 请求的成功和错误案例的完整说明,请参阅 jQuery.ajax() 文档)。

$.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.
  // Each argument is an array with the following structure: [ data, statusText, jqXHR ]
  var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It"
  if ( /Whip It/.test( data ) ) {
    alert( "We got what we came for!" );
  }
});

当两个ajax请求都成功时执行函数myFunc,如果其中一个有错误则执行myFailure

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

相关用法


注:本文由纯净天空筛选整理自jquery.com大神的英文原创作品 jQuery.when()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。