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, width: "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, width: "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); } } }); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM