2013-10-15 37 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:谢谢!固定。 –

相关问题