在Jquery中,如何延迟执行包含异步调用的同步函数?

时间:2012-11-14 16:38:34

标签: javascript jquery

我很困惑。如果是这段代码:

function prepareit(list){
    for(i=0;i<list.length;i++){
         var test = list[i];
         $.ajax({....});
    }
}

function testit(list){
    for(i=0;i<list.length;i++){
         var test = list[i];
         $.ajax({....});
    }
}

$(document).ready(function() {
    var list = ['ti','meti','medes','fra','u','w','ro','sit','hd','i'];
    prepareit(list);
    testit(list);
});

当“prepareit”完成时,我需要执行“testit”函数。我已经尝试过“when-then”方法,但是函数同时启动。

(抱歉我的英语不好)

2 个答案:

答案 0 :(得分:1)

创建一个延迟对象,该对象在完成所有ajax请求后解析。

function prepareit(list){
    var defArr = [];
    for(i=0;i<list.length;i++){
         var test = list[i];
         defArr.push($.ajax({....}));
    }
    return $.when.apply($,defArr);
}

function testit(list){
    var defArr = [];
    for(i=0;i<list.length;i++){
         var test = list[i];
          defArr.push($.ajax({....}));
    }
    return $.when.apply($,defArr);
}

$(document).ready(function() {
    var list = ['ti','meti','medes','fra','u','w','ro','sit','hd','i'];
    prepareit(list).done(function(){
        testit(list).done(function(){
            alert("All done!");
        });
    });
});

答案 1 :(得分:0)

您可以在testit中的ajax请求的成功函数中调用prepareit,如下所示:

function prepareit(list){
    for(i=0;i<list.length;i++){
         var test = list[i];
         $.ajax({ success: function (data) { testit(list); } });
    }
}

function testit(list){
    for(i=0;i<list.length;i++){
         var test = list[i];
         $.ajax({....});
    }
}

$(document).ready(function() {
    var list = ['ti','meti','medes','fra','u','w','ro','sit','hd','i'];
    prepareit(list);
    //testit(list);
});

但是,如果依赖于“测试”之前“准备好”的整个列表,这将不起作用。我会说循环ajax请求不是最好的方法 - 如果可能的话你应该改变你的代码来传递ajax调用中的整个列表而不是循环多次(不知道你想要完成的是什么)疗程)。