浅谈异步并发 - Asynchronous Request At The Same Time
Liber 2013-03-21 10:31

一直以来都在津津乐道,html提供的异步请求的特性使得我们前端工程师的日子明朗了起来。

这几天在项目中,涉及到了异步并发的访问,引发了一系列问题:

问题一:异步并发的时候,如果前面的请求还没完成,后面的请求返回的内容会对面前的请求造成影响。因为后面的请求会覆盖前面请求的XMLHttpRequest对象。

其实这个问题,据说现在的$.ajax()每次访问都是new一个XMLHttpRequest对象,所以使用$.ajax()方法不会出现这个问题。
这个我也没去求证,我写了一个原生的请求,希望来规避这个问题:

var requestMessage = function(jlsj, patientId, treatId) {

	var jsonData = {
		"jlsj": jlsj,
		"patientId": patientId,
		"treatId": treatId
	};
	jsonData = jQuery.param(jsonData);
	
	var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function() {
		if(xhr.readyState==4) {
			if( (xhr.status>=200&&xhr.status<300) || xhr.status==304 ) {
				var obj = jQuery.parseJSON(xhr.responseText);
				if(!obj.error) {
					nurse.initMessages(obj.result);
				}
				delete xhr;
				xhr = null;
			}
		}
	};
	xhr.open("post", "../orderRecord_getMessageList", true);
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");	
	xhr.send(jsonData);
	
};

问题二:据说在微软提供的服务器下,同一session的并发访问,在服务端这边,会形成一个队列来处理,也就是说,要等前面的请求返回了才会处理之后的请求。(貌似PHP也是类似的处理方式)

这个问题,我在struts + spring下试了一下,貌似不是这样的(这里我关闭了默认的单例模式)。
别的平台我也没去求证,反正队列就队列吧,不至于不返回结果给我。

问题三:struts + spring默认是单例模式,这样,服务端在处理异步请求的时候,可能会引起一些问题。

这个具体会引起什么问题我也不知道,但是,总归前端发出的请求,还是应该关闭单例模式