循环内嵌套的ajax调用未按顺序

时间:2016-10-25 13:52:11

标签: javascript jquery ajax promise jquery-deferred

我有一个嵌套的AJAX调用。

AJAX位:

function a(val){
    var def = $.Deferred();
    return $.ajax({
        type : "get",
        url : "myservlet",
        beforeSend : function() {
            $('#text1').css({
                "color" : "red"
            });
            $('#text1').text("Running Graph");
        },
        data : {
            "boxval" : val
        }
    }).done(function(responseText) {
        $('#text1').css({
            "color" : "green"
        });
        $('#text1').text(responseText);
    }).then(function(){
        return $.when(b());
    });
}

function b(){
    return $.ajax({
        type : "get",
        url : "ConnectServlet",
        beforeSend : function() {
            $('#text2').css({
                "color" : "red"
            });
            $('#text2').text("Copying Files and preparing pSet");
        }
    }).done(function(responseText) {
        $('#text2').css({
            "color" : "green"
        });
        $('#text2').text(responseText); 
    }).then(function(){
        return $.when(c());
    });
}

function c(){
    return $.ajax({
        type : "get",
        url : "CopyServlet",
        beforeSend : function() {
            $('#text3').css({
                "color" : "red"
            });
            $('#text3').text("Running Dynamic Diff Graph");
        }
    }).done(function(responseText) {
        $('#text3').css({
            "color" : "green"
        });
        $('#text3').text(responseText);
    }).then(function(){
        return $.when(d());
    });
}

function d(){
    $('#summary').show();
}

我需要的是ajax调用的整个链(主要的ajax调用,函数b,函数c和函数d),以便为循环的每次迭代执行。

正在发生的事情是整个主要的ajax调用在没有为循环的每次迭代调用函数b的情况下执行。

我需要它执行以下操作:

  • B'/ p>

  • C

  • d

  • B'/ p>

  • C

  • d

  • ...

正在发生的事情是:

  • 一个
  • 一个
  • 一个
  • ...
  • B'/ LI>

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

每次通话需要一段时间才能执行,而您根本没有考虑到这一点。

你发出第一个GET请求,这可能需要几秒钟才能返回。您的JavaScript并不等待它发生并继续执行代码。

解决方案是引入类似" javascript promise"。一旦第一次调用实际完成并且你有响应数据,你基本上只调用函数b。

这是一篇帮助您入门的文章:https://davidwalsh.name/promises

不要停在这里,并阅读更多有关此主题的内容。你可以链接这样的多个事情,并根据需要进行行为。