如果沒有參數傳遞給 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()
, 並且它不是一個Deferred或Promise對象, 那么它會被當作是一個被解決(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 );