2012-08-23 106 views
1

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

我是新来的延期方法,所以我希望有人能指出我在正确的方向,或指出另一个(也许更好)的方式做到这一点。

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:没有太多的爱这个问题 - 任何进一步的想法?

回答

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. 
}) 
相关问题