Javascript 循环中的嵌套ajax调用没有按顺序执行

Javascript 循环中的嵌套ajax调用没有按顺序执行,javascript,jquery,ajax,promise,jquery-deferred,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" });

我有一个嵌套的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

我需要它执行以下操作:

  • a

  • b

  • c

  • d

  • a

  • b

  • c

  • d

相反,正在发生的是:

  • a
  • a
  • a
  • b

如何解决这个问题?

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

您启动第一个GET请求,可能需要几秒钟才能返回。您的JavaScript不会等待这种情况发生,而是一直执行代码

一个解决方案是引入类似“javascript承诺”的东西。基本上,只有在第一次调用实际完成并获得响应数据后,才能调用函数b

以下是一篇文章,让您开始学习:

不过,不要停在这里,多读一些关于这个主题的文章。您可以链接多个类似的东西,并根据需要设置行为