尝试按顺序运行javascript AJAX调用

时间:2011-06-13 11:17:07

标签: javascript jquery ajax

我试图对AJAX进行三次调用,并向我建议以下内容:

function getData(Code) {
    return $.post('/adminA/GetData', { Code: Code }, function (data) {/*etc.*/});
}

getData(0).done(function() {
    getData(1).done(function() {
        getData(2);
   });
});

当我运行代码时,它会给出一个错误,指出getData(0)未定义。当我像这样运行代码时它运行正常,但数据不按顺序返回:

 getData(0);
 getData(1);
 getData(2);
 getData(3);

有谁知道为什么第一个解决方案不起作用。似乎它试图对它不知道的事情执行.done

3 个答案:

答案 0 :(得分:2)

您发布的代码对我来说很合适。

我在http://jsfiddle.net/alnitak/G8tmp/放了一份副本,然后按要求运作。

您在retrieveData()中报告了错误,但在您发布的代码中没有此类功能。

答案 1 :(得分:1)

您正在呼叫$.post,然后在通话结束后尝试定义done个事件。

我知道这很难看,但我猜测以下内容会起作用:

$.post('/adminA/GetData', { Code: 0 }, function (data) {/*etc.*/}).done(function(){
    $.post('/adminA/GetData', { Code: 1 }, function (data) {/*etc.*/}).done(function(){
        $.post('/adminA/GetData', { Code: 2 }, function (data) {/*etc.*/}).done(function(){
            $.post('/adminA/GetData', { Code: 3 }, function (data) {/*etc.*/});
        });
    });
});

一些漂亮的重构应该可以帮助你减少这种情况。

答案 2 :(得分:1)

修改函数getData以接收回调函数。像这样:

function getData(Code,done) {
    return $.post('/adminA/GetData', { Code: Code }, function (data) {if(typeof(done)=='function') {done();} /*etc.*/});
}

所以后来得到名为sequentely的AJAX就像这样调用它:

getData(0,function() {
    getData(1,function() {
        getData(2);
   });
});