2013-10-15 38 views
1

我知道有幾種方法可以在ajax調用完成之前執行代碼,並且我知道使用when() - method是推薦的做法 this。 (http://api.jquery.com/jQuery.when/

我有一個函數loadFilter()它返回一個延遲的對象是這樣的:

function loadFilter() { 
    ...code... 
    return $.ajax({ 
     type: 'POST', 
     url: loadFile, 
     data: {object: obj}, 
     dataType: 'html' 
    }).done(function(data) { 
     $(targetDiv).html(data); 
     initDrag(); 
     $("body").removeClass("wait"); 
    }) 
    .fail(function(ts) { 
     alert(ts.responseText); 
    });  
} 

而且從getpage()不同的值調用loadFilter()功能進行二次另一個函數調用:

function getpage() { 
    ...code... 
    loadFilter(subcatId, "getnavigationpages", paginationDiv, doSearch);    
    loadFilter(subcatId, "getproducts", targetDiv, doSearch); 

    //When ajax-calls are done in function loadFilter. 
    $.when(loadFilter()).done(function(rsdata1) { 
     ...code to execute when both loadFilter-functions above 
    }); 
} 

我怎麼知道什麼時候執行$ .when()?我想執行代碼時loadFilters()被稱爲,但我認爲!? $ .when()可以在第一次loadFilter()被調用時執行 或者第二次?

回答

3

$.when接受任意數量的承諾,並解決所有這些承諾解決。所以,你的代碼會是這個樣子:

$.when(
    loadFilter(subcatId, "getnavigationpages", paginationDiv, doSearch), 
    loadFilter(subcatId, "getproducts", targetDiv, doSearch) 
).always(function() { 
    // Both have completed 
}); 

我上面使用always,無論分辨率的類型中的哪一個觸發(解決,失敗等)。或者您可以使用done僅處理成功的分辨率,或者使用then分別處理每種類型的分辨率。

+1

謝謝你的快速和良好的答案。現在我真的瞭解如何使用then()以及:-)當我能夠(還剩8分鐘)時,我會接受這個答案 – bestprogrammerintheworld

+1

@TJCrowder:也許你的意思是「總是」而不是「然後」。 「總是」是無論延期狀態如何都會被觸發的「事件」。 'then'用於鏈接延遲,它有3個參數:'doneCallbacks,failCallbacks,progressCallbacks'。 – LeGEC

+0

@LeGEC:謝謝!固定。 –

相關問題