當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。