jquery.when() 原理


如果沒有參數傳遞給 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 );

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM