jQuery.when( deferreds )

来源:互联网 发布:知乎 大连佳禾外语 编辑:程序博客网 时间:2024/05/16 16:02

描述:提供一种方法来执行零个或多个 Thenable(愚人码头注:即带有then方法) 对象的回调函数, 通常是表示异步事件的Deferred(延迟) 对象。

· 

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

· 

· 

deferreds

· 

类型:Deferred Promise Thenable 

· 

零个或多个延迟对象,或者普通的JavaScript对象。

· 

如果没有参数传递给jQuery.when(),它会返回一个resolved状态的Promise

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

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


如果一个参数被传递给jQuery.when() 并且它不是一个DeferredPromise对象, 那么它会被当作是一个被解决(resolved)的延迟对象,并且绑定到上面的任何doneCallbacks都会被立刻执行。向doneCallbacks中传入的是原始的参数。在这种情况下,设定的任何failCallbacks永远都不会被执行,因为延迟对象永远不会被拒绝(rejected)。例如:

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


如果你不传递任何参数,
 
jQuery.when()将返回一个resolved(解决)状态的promise对象。

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


在多个延迟对象传递给jQuery.when() 的情况下,该方法根据一个新的宿主” Deferred(延迟)对象,跟踪所有已通过Deferreds聚集状态,返回一个Promise对象。当所有的延迟对象被解决(resolve)时,宿主” Deferred(延迟)对象才会解决(resolved)该方法,或者当其中有一个延迟对象被拒绝(rejected)时,宿主” Deferred(延迟)对象就会reject(拒绝)该方法。如果宿主” Deferred(延迟)对象是(resolved)解决状态时,宿主” Deferred(延迟)对象的doneCallbacks(解决回调)将被执行。参数传递给doneCallbacks提供这解决(resolved)值给每个对应的Deferreds对象,并匹配Deferreds传递给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递延对象的解决(resolved)事件, 那么相应的doneCallback参数将是undefined如果传递给Deferred递延对象的解决(resolved)事件为单个的值, 相应的参数将保留那个值。 在传递给Deferred递延对象的解决(resolved)事件为为多个值的情况下, 相应的参数将是这些值组成的数组。例如:

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


在多延迟情况下,如果Deferreds延迟对象一被拒绝(rejected),jQuery.when()触发立即调用宿主” Deferred(延迟)对象的failCallbacks。请注意在这个时间点上,有一些延迟对象仍然可以是未解决(unresolved)的。 传递给failCallbacks的参数匹配Deferred(延迟)对象的failCallbacksrejected拒绝的顺序。那么,在这种情况下,如果需要执行一些额外的处理,例如,取消所有未完成的ajax请求,你可以在闭包中进行保持jqXHR对象的引用,并且在failCallback中检查或取消它们。

例子:

Example: 执行Ajax请求后两个函数是成功的。(见jQuery.ajax()对于一个成功的和错误的案件为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 */  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有一个错误。

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


原创粉丝点击