最近寫頁面,需要做 業務線 和 業務 的級聯組件,並在頁面打開就做好初始化。
原來用的方案是每個初始化的方法返回一個Boolean類型的值,在方法調用處,用while循環判斷是否幾個初始化的方法全部返回了值,但是這種方式會造成資源的浪費,後來就百度了一下,發現自己進入思維誤區了,ajax請求是異步的,改爲同步不就好了。。。。。。
【原方案】
$(function () {
var flag1 = initBusinessLine();
var flag2 = initBusiness();
while(!flag1 || flag2){
}
}
function initBusinessLine() {
$.get(url, function (data) {
//ajax查詢
}
return true;
}
function initBusiness() {
$.get(url, function (data) {
//ajax查詢
}
return true;
}
【改後的方案】
只需在ajax請求體中設置: async: false
$(function () {
initBusinessLine();
initBusiness();
$("#businessLineSelect").change(function () {
initBusiness();
});
});
function initBusinessLine() {
$.ajax({
type: 'POST',
url: basePath + "/mapping/getAllBusinessLine.do",
dataType: "json",
async: false,
success: function (data) {
if (data.resultCode == '0000') {
var businessLineList = data.data;
var businessLineHtml = '';
for (var i in businessLineList) {
businessLineHtml += '<option value="' + businessLineList[i] + '">' + businessLineList[i] + '</option>';
}
$("#businessLineSelect").html(businessLineHtml);
} else {
bootbox.alert(data.resultMsg);
}
}
});
}
function initBusiness() {
var businessLine = $("#businessLineSelect").val();
$.ajax({
type: 'POST',
url: basePath + "/mapping/initBusiness?param=" + businessLine,
dataType: "json",
async: false,
success: function (data) {
if (data.resultCode == '0000') {
var businessList = data.data;
var businessHtml = '';
;
for (var i in businessList) {
businessHtml += '<option value="' + businessList[i] + '">' + businessList[i] + '</option>';
}
$("#businessSelect").html(businessHtml);
} else {
bootbox.alert(data.resultMsg);
}
}
});
}