• js中,for循环里面放ajax,ajax访问不到变量以及每次循环获取不到数据问题总结


      想在点击"终端控制"的时候能够开启多个窗口对多个终端进行管理:

    /**提交事件**/
        $("#terminalControl").bind("click",function(){
            $("#terminalControl").removeClass();
            $("#terminalControl").addClass("btn_pointToPint " + $.cookie("color"));
            var keyValue = $("#gridTable").jqGridRowValue("id");
            var keyValueArray = keyValue.split(','),
            len = keyValueArray.length;
            for(var i = 0; i < len; i++){
                var rowData = $("#gridTable").jqGrid('getRowData',keyValueArray[i]);
                   if(checkedRow(keyValueArray[i])){
                       $(this).attr("disabled","disabled");
                           $.ajax({ 
                             async:false,//必须设置为false,同步才行
                             url:'${basePath}/ptp/ptpAction_ipValid.do',
                             data:{ip:getcellTitle(rowData.ip)},
                             beforeSend:function(){
                                $("#terminalControl").attr("value",'<s:text name="cems.ptp"></s:text>');
                             },
                            success:function(responseText){
                                $("#terminalControl").attr("value",'<s:text name="cems.ok"></s:text>');
                                $("#terminalControl").removeAttr("disabled");
                                var obj = eval("(" + responseText + ")");
                                if(obj.result == "success"  ){
                                    var resourceId="";
                                    $.each(top.authorizeMenuData,function(i,n){
                                        if(n.text=="点对点控制"&&n.mark=="menu"||n.text=="ptpControl"&&n.mark=="menu"){
                                           resourceId=n.id;
                                        }
                                    })
                                window.open("${basePath}/ptp/ptpAction_main.do?resourceId="+resourceId,"_blank"," toolbar=yes, menubar=yes, scrollbars=yes, resizable=yes,location=no, status=yes",false); 
                                }else if(obj.result == "multi"){
                                    var ip = $("#ip_input").val();
                                    dialogOpen({
                                       id: "ptp",
                                       title: "在线设备",
                                       url: "/ptp/ptpAction_listUI.do?ip="+ip,
                                        "500px",
                                       height: "1000px",
                                       offset:"rb",
                                       btn:null
                                    })
                                }
                                else if(obj.result == "connectServerFail"){
                                   dialogMsg("连接服务器失败!",0);
                                }else if(obj.result == "analyzeError"){
                                   dialogMsg("服务配置解析数据失败!",0);
                                }else if(obj.result == "notOnline"){
                                   dialogMsg("该设备不在线!",0);
                                }else{
                                   dialogMsg('<s:text name="cems.public.msgFail"></s:text>',0);
                             }
                           }
                       });
                   }
            }
        });  
    }

      结果每次点开虽然开了多个窗口,但是每个窗口都是一样的,并没有达到开多个终端的页面的预期。

      问题所在:for 循环是一个单线程的东西,而ajax是多线程的,之所以称之为异步同步,是因为执行到ajax的时候去后台开启了一个线程,但是for循环本身就是一个单线程的东西,那么执行到ajax的时候,ajax开启了一个线程,for循环是没有等他的,直到for循环结束的时候,才会把ajax返回的数据拿回来,所以会出问题。

      解决办法:只需要把ajax改成同步的就可以了,每次for循环,都要去加载ajax方法,并且拿到他返回的数据,只需要在ajax中间加一个代码就可以搞定了。async: false,//设置成同步。

    1、设置ajax参数async为false,即与js同步,默认是true(异步)。

    2、采用递归循环的方法解决此问题。

    function func(times){
        if(times <= 0){
            return;
        }
        $.get(url,data,function(){
            times --;
            func(times); //递归调用
        });
    }
    func(5);

     接下来我在试试:

    1、当async:false的时候,

    2、当async:true的时候,

    3、采用递归的方式:

     /* 远程控制提交事件**/
    $("#terminalControl").bind("click",function(){
        $("#terminalControl").removeClass();
        $("#terminalControl").addClass("btn_pointToPint " + $.cookie("color"));
        var keyValue = $("#gridTable").jqGridRowValue("id");
        var keyValueArray = keyValue.split(','),
             len = keyValueArray.length,
             i = 0;
        doajaxmenu(keyValueArray,i,len);
    }); 
    
    function doajaxmenu(keyValueArray,i,len){
        if(i >= len){
            return;
        }
        var rowData = $("#gridTable").jqGrid('getRowData',keyValueArray[i]);
        if(checkedRow(keyValueArray[i])){
            $(this).attr("disabled","disabled");
                $.ajax({ 
                 async:false,
                 url:'${basePath}/ptp/ptpAction_ipValid.do',
                  data:{ip:getcellTitle(rowData.ip)},
                  beforeSend:function(){
                     $("#terminalControl").attr("value",'<s:text name="cems.ptp"></s:text>');
                  },
                 success:function(responseText){
                     $("#terminalControl").attr("value",'<s:text name="cems.ok"></s:text>');
                     $("#terminalControl").removeAttr("disabled");
                     var obj = eval("(" + responseText + ")");
                     if(obj.result == "success"  ){
                         var resourceId="";
                           $.each(top.authorizeMenuData,function(i,n){
                               if(n.text=="点对点控制"&&n.mark=="menu"||n.text=="ptpControl"&&n.mark=="menu"){
                                  resourceId=n.id;
                               }
                           })
                    window.open("${basePath}/ptp/ptpAction_main.do?resourceId="+resourceId,"_blank"," toolbar=yes, menubar=yes, scrollbars=yes, resizable=yes,location=no, status=yes",false); 
                          
                     }else if(obj.result == "multi"){
                         var ip = $("#ip_input").val();
                         dialogOpen({
                            id: "ptp",
                            title: "在线设备",
                            url: "/ptp/ptpAction_listUI.do?ip="+ip,
                             "500px",
                            height: "1000px",
                            offset:"rb",
                            btn:null
                         })
                     }
                     else if(obj.result == "connectServerFail"){
                          dialogMsg("连接服务器失败!",0);
                     }else if(obj.result == "analyzeError"){
                        dialogMsg("服务配置解析数据失败!",0);
                     }else if(obj.result == "notOnline"){
                         console.log(i);
                        //dialogMsg("该设备不在线!",0);
                     }else{
                        dialogMsg('<s:text name="cems.public.msgFail"></s:text>',0);
                      }
                     i=i+1;
                     if(i < len){
                         doajaxmenu(keyValueArray,i,len); 
                     }
                }
            });
           }
    }
  • 相关阅读:
    .net大文件上传
    java文件上传和下载
    文件上传系统
    plupload上传大文件
    代码坏味道之夸夸其谈的未来性
    freemarker中的substring取子串
    【翻译自mos文章】在Oracle GoldenGate中循环使用ggserr.log的方法
    3种浏览器性能測试
    SDUTOJ 2772 KMP简单应用
    C++库研究笔记--用__attribute__((deprecated)) 管理过时代码
  • 原文地址:https://www.cnblogs.com/goloving/p/7376378.html
Copyright © 2020-2023  润新知