浅谈异步并发 - 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默认是单例模式,这样,服务端在处理异步请求的时候,可能会引起一些问题。
这个具体会引起什么问题我也不知道,但是,总归前端发出的请求,还是应该关闭单例模式。