Jquery - 确保在AJAX调用完成后执行代码块?

时间:2012-08-23 23:04:16

标签: ajax jquery jquery-deferred

我目前有一些JQuery代码,我试图确保只有在第一个块中的AJAX调用完成后才执行一个代码块。我遇到了一些问题 - 但是我试图使用JQuery Deferred方法来执行此操作(下面的代码),但是第一个或第二个代码块都没有运行,所以我假设我在错误的轨道上。

我是Deferred方法的新手,所以我希望有人可以指出我正确的方向,或指出另一种(或许更好)的方法。

function makeChains(){
    $('.chained_to_vehicle_make_selector').remoteChainedTo('.chained_parent_vehicle_make_selector', '/models.json');
    $('.chained_to_vehicle_model_selector').remoteChainedTo('.chained_parent_vehicle_model_selector', '/trims.json');
    $('.chained_to_vehicle_trim_selector').remoteChainedTo('.chained_parent_vehicle_trim_selector', '/model_years.json');
}

var chainCall = $.Deferred(function() {
    makeChains();
});

chainCall.done(function() { 
    $(".chzn-select").chosen();
    $(".chained_parent_vehicle_make_selector").chosen().change( function() {$(".chained_to_vehicle_make_selector").trigger("liszt:updated"); });
    $(".chained_parent_vehicle_model_selector").chosen().change( function() {$(".chained_to_vehicle_model_selector").trigger("liszt:updated"); });
    $(".chained_parent_vehicle_trim_selector").chosen().change( function() {$(".chained_to_vehicle_trim_selector").trigger("liszt:updated"); });
    $(".chained_child").chosen();
});

我还尝试将chainCall.resolve();添加到最后,但无济于事。

有人可以帮忙吗?

编辑:我已经看过这里的解决方案:Waiting for jQuery AJAX response(s)看起来它会起作用,但我认为问题可能是remoteChainedTo似乎没有内置 - 在回调?我是否需要修改代码以添加回调以使其工作,或者JQuery能够帮助我吗? remoteChainedTo插件正在使用getJSON从网址中提取数据。

编辑2:对这个问题不太感兴趣 - 还有什么想法?

1 个答案:

答案 0 :(得分:0)

考虑到remoteChained方法返回一个jqXHR对象(延迟),你可能想尝试类似的东西:

var dfds = [],
list = ['vehicle_make_selector','vehicle_model_selector','vehicle_trim_selector'],
urls = ['/models.json','trims.json','/model_years.json'];

for(var i=0;i<list.length;i++){
    dfds.push( $('chained_to_' + list[i]).remoteChainedTo('chained_parent',urls[i]);
}

$.when.apply($,dfds).done(function(){
     $(".chzn-select").chosen();
     //... rest of the code.
})
相关问题