1. 程式人生 > >【js/jquery】非同步請求問題

【js/jquery】非同步請求問題

我們通常會使用jquery封裝的$.post或者$.get函式來做非同步請求,非同步的意思是當一處發出非同步請求以後,不會等待請求返回然後再執行後面的函式,而是直接執行後面的函式。有點類似於java中的多執行緒概念,但js中其實沒有多執行緒的概念,可以幫助理解。下面來看具體例子:

$(function(){
	f();
	g();
});



function f(){
	var url = "ajax.htm";
	$.post(url,{"param1":"ly"},function(data){
		alert("ajax function");
	},"text");
		
}

function g(){
	alert("g function");
}
按照我們通常的理解,函式是順序執行的,也就是先執行f,f發出一個非同步請求,請求完成後輸出“ajax function”,然後f返回,執行g,輸出“g function”。但是實際的情況卻不是,而是先輸出了“g function”,然後才是“ajax function”。這說明執行到f的非同步請求後,程式並不是等待後臺返回,而是繼續執行後面的函式。特別是如果後臺返回的事件很久的話,那麼肯定是會直接執行後面的函式。這裡後臺的程式設定了等待5秒弄才返回的。
@RequestMapping(value = "ajax.htm")
	public @ResponseBody Object ajax(HttpServletRequest request){
		String param = request.getParameter("param1");
		System.out.println(param);
		JSONObject object = new JSONObject();
		object.put("name", "lzy");
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return object.toString();
	}
這也證實了非同步的存在,提醒我們如果要用$.post,那麼就要注意這個問題了,比如說,程式通過非同步請求獲得了一個數組,然後有函式通過這個陣列來初始化介面,這時候就有可能在用陣列的時候,陣列還沒有被返回,造成undefined的錯誤。解決方法有兩個:

1.如果非要讓g在f非同步請求完了之後執行,那麼就把對g的呼叫放到f非同步請求的success:function裡面,這樣可以保證同步;

2.&.post預設是非同步的,當然我們可以設定為同步的,只需要在開頭新增:

$.ajaxSetup({   
    async : false  
});
即可。或者使用更底層的$.ajax方法。