下面一個簡單的例子,說明前后端交互中,Ajax同步和異步的使用
1、設置簡單的一個div,包含觸發事件
CompanyType()
<div> <input type="hidden" id="branchHidden" name="branchHidden" value="" /> <input type="hidden" id="companyType" name="companyType" value="" /> @Html.DropDownList("companyList", ViewData["companyList"] as SelectList, new { @class = "select1 month", id = "branch", onchange = "CompanyType();Time1();" }) </div>
2、寫一個Ajax,調用后台的方法
<script type="text/javascript"> function CompanyType() { var companyId = document.getElementById('branchHidden').value;//獲取隱藏域的值 $.ajax({ url: "@Url.Action("GetCompanyNatureId", "Basic")",//需要調用的控制器里面的方法;控制器名
Basic,方法名
GetCompanyNatureId,,,,,url的寫法有多種,也可以寫成其他形式的url
async: false, //這個表示是否同步,false是同步,,,,true是異步,,,,,如果不寫這個,默認為異步,,,注意點!!!
data: { companyId: companyId }, //data是要傳的參數,冒號前面是參數名,務必和后台方法體的參數名保持一致,后面是要傳的參數值
success: function (data) {
$("#companyType").val(data); } //這個data是后台接口調用成功之后返回的參數,需要注意的是,如果掉成功之后在這個function函數里面要執行這樣的方法,並使用返回參數,那么后台接口的返回值類型要設置字符串類型,具體看下方代碼
});
}
</script>
public string GetCompanyNatureId(string CompanyId) { return business.GetCompanyNatureId(CompanyId); }
public string GetCompanyNatureId(string CompanyId) { string CompanyNatureId = ""; CompanyMdl subCompany = new core.CompanyMdl { CompanyID = CompanyId }; BaseResponse<List<CompanyMdl>> RsCompany = new BaseResponse<List<core.CompanyMdl>>(); RsCompany = data.GetSubCompanyList(subCompany); List<CompanyMdl> companyList = new List<CompanyMdl>(); companyList = RsCompany.Data; if (companyList.Count > 0) { CompanyNatureId = companyList[0].CompanyNatureId; } return CompanyNatureId; }
string apiUrl = System.Configuration.ConfigurationManager.AppSettings["APIUrl"].ToString(); //api地址
//這個是調用接口的數據
public BaseResponse<List<CompanyMdl>> GetSubCompanyList(CompanyMdl subCompany) { BaseResponse<List<CompanyMdl>> Response = new BaseResponse<List<CompanyMdl>>(); try { Response = SendHttpRequest<BaseResponse<List<CompanyMdl>>>(apiUrl + "api/Bx/GetSubCompanyList",GetJsonFromObj<CompanyMdl>(subCompany), CommonHttpWebMethodEnum.POST); } catch (Exception ex) { throw ex; } return Response; }
注意一下紅色標識!!!
我的觸發事件中有兩個函數的調用:CompanyType();Time1();
那么,同步和異步究竟是怎么體現的呢?
第一種情況:
我的
CompanyType()中有Ajax的調用,而且返回值要在
Time1()函數中用到,所以,
我需要先調用完后台接口之后,再執行
Time1()函數,這就要用同步,,,,Ajax和后台接口執行完了之后,再走下一個函數;
第二種情況:
CompanyType()和
Time1(),相互獨立,沒有交叉的引用,那么,我可以選擇使用異步,這兩個函數先后執行完之后,Ajax調用的后台接口再去執行,這樣表達在頁面上,執行效率就會快很多。