Javascript Jquery ajax调用内部成功函数

Javascript Jquery ajax调用内部成功函数,javascript,jquery,ajax,jquery-ui,Javascript,Jquery,Ajax,Jquery Ui,我试图在success函数中进行ajax调用。在第二个ajax调用中,我将向一个隐藏字段添加一些数据。就在for循环之后,alert显示隐藏字段包含数据,但当我将alert放在secod ajax调用之外时,它显示为空。为什么隐藏的字段会被清除 <input type="hidden" id="hdnMenuChild" name="hdnMenuChild" /> <script> function loadMe

我试图在success函数中进行ajax调用。在第二个ajax调用中,我将向一个隐藏字段添加一些数据。就在for循环之后,alert显示隐藏字段包含数据,但当我将alert放在secod ajax调用之外时,它显示为空。为什么隐藏的字段会被清除

<input type="hidden" id="hdnMenuChild" name="hdnMenuChild" />

            <script>
                function loadMenue() {

                    var url = "/UserManagement/GetUserMenue";

                    $.ajax({
                        type: "GET",
                        url: url,
                        contentType: "application/json; charset=utf-8",
                        //data: { initialApplicantID: initialApplicantID },
                        dataType: "json",
                        success: function (data) {
                            var mUL = "";
                            for (var x = 0; x < data.length; x++) {

                                if (data[x].MenueLevel == "0" && data[x].URL!="#") {

                                    mUL = mUL + '<li>';
                                    mUL = mUL + '<a href=' + data[x].URL + '>';
                                    mUL = mUL + '<span class="menu-text">' + data[x].Name + '</span>';
                                    mUL = mUL + '</a></li>';
                                }

                                if (data[x].MenueLevel == "0" && data[x].URL == "#") {

                                    mUL = mUL + '<li>';
                                    mUL = mUL + '<a href=' + data[x].URL + ' class="dropdown-toggle">';
                                    mUL = mUL + '<span class="menu-text">' + data[x].Name + '</span>';
                                    mUL = mUL + '<b class="arrow icon-angle-down"></b>';
                                    mUL = mUL + '</a>';
                                    mUL = mUL + '<ul class="submenu">';

                                    $.ajax({
                                        type: "GET",
                                        url: "/UserManagement/GetUserMenue?parentID=" + data[x].PermissionID,
                                        contentType: "application/json; charset=utf-8",
                                        //data: { initialApplicantID: initialApplicantID },
                                        dataType: "json",
                                        success: function (datay) {

                                            for (var y = 0; y < datay.length; y++) {

                                                $("#hdnMenuChild").val($("#hdnMenuChild").val() + '<li>');
                                                $("#hdnMenuChild").val($("#hdnMenuChild").val() + '<a href=' + datay[y].URL + '>');
                                                $("#hdnMenuChild").val($("#hdnMenuChild").val() + '<i class="icon-double-angle-right"></i>');
                                                $("#hdnMenuChild").val($("#hdnMenuChild").val() + datay[y].Name);
                                                $("#hdnMenuChild").val($("#hdnMenuChild").val() + '</a></li>'); 
                                            }
                                           alert($("#hdnMenuChild").val());//here, alert shows data.
                                        }
                                    });
                                   alert($("#hdnMenuChild").val());//alert shows empty data here
                                    mUL = mUL + '</ul>';
                                    mUL = mUL + '</li>';
                                }

                            }

                            $("#userMenue").html(mUL);
                        }
                    });


                }

函数loadMenue(){
var url=“/UserManagement/GetUserMenue”;
$.ajax({
键入:“获取”,
url:url,
contentType:“应用程序/json;字符集=utf-8”,
//数据:{InitialApplicationId:InitialApplicationId},
数据类型:“json”,
成功:功能(数据){
var mUL=“”;
对于(var x=0;x';
mUL=mUL+'';
}
if(数据[x].MenueLevel==“0”&&data[x].URL==“#”){
mUL=mUL+'
  • '; mUL=mUL+“”; mUL=mUL+”
      ; $.ajax({ 键入:“获取”, url:“/UserManagement/GetUserMenue?parentID=“+data[x].PermissionID, contentType:“应用程序/json;字符集=utf-8”, //数据:{InitialApplicationId:InitialApplicationId}, 数据类型:“json”, 成功:功能(数据Y){ 对于(变量y=0;y); $(“hdnMenuChild”).val($(“hdnMenuChild”).val()+'); } 警报($(“#hdnMenuChild”).val();//此处,警报显示数据。 } }); 警报($(“#hdnMenuChild”).val();//警报在此处显示空数据 mUL=mUL+'
    '; mUL=mUL+'
  • '; } } $(“#userMenue”).html(mUL); } }); }
    您是否验证了在整个过程完成后不会在DOM中填充隐藏字段。请记住,$.ajax在默认情况下是异步的,第二个ajax调用返回并在DOM中设置元素所需的往返时间比处理下一个函数所需的时间要长,在本例中,您将收到以下警报。因此,在调用警报时,没有任何东西进入DOM。您可以通过两种方式来实现这一点:1)为成功创建回调,或2)通过使用“async:false”设置强制$.ajax为非异步。我个人会选择回调方法并处理所有成功代码。但是,除非您使ajax调用非异步,否则您可能永远不会从该警报返回数据,无论您与服务器的连接有多快。。即使它在同一台机器上是本地的


    另外,我相信您有一个很好的理由,但是循环从ajax调用返回的数据,然后为该数据中的每个项调用另一个ajax调用似乎效率很低。我不知道服务器代码是否不可用或在您的控制下,但是可能应该在服务器上创建一个新的端点来命中它,它将在第二次ajax调用中返回您要查找的所有数据。只是想一想。

    因为在发出警报时,第二个ajax调用尚未发出。ajax调用是异步的,所以完成后需要发生的任何事情都需要进入成功回调。在我的例子中,由于它是一个菜单,ajax调用希望从数据库中读取10-15个以上的项。因此,我认为会有一个严重的性能问题。请记住,对于一些并发用户来说,这是很好的。。对于成百上千的并发用户来说,这将给您的服务器带来一点额外的费用。我不知道您的项目的交付范围,但您需要记住,不必要的处理会不必要地使用资源。;)