我的web应用程序在地图上实现了“空间选择”,它选择街道的数量。在选择之后,我得到所有使用“选择处理程序”选择的街道的唯一街道ID。
我的下一步是将ajax请求发送到每个街道id的服务器并返回响应。目前,我只使用single for loop并按如下方式发送每个街道id的ajax请求。
for (var index in streetIds) {
sendAjaxRequest(streetIds[index]);
}
function sendAjaxRequest(streetId) {
$.ajax({
type : 'POST',
url : OpenLayers.ProxyHost + this.url,
data : streetId,
success : function(response) {
sos.parseSOSObservations(response);
},
error : function(x, e) {
alert("Something went wrong in the request" + e);
}
});
}
例如:如果用户在地图上选择了1000条街道,那么我的程序将发送1000个post请求,这将明显减慢我的应用程序的速度并阻止浏览器。
有人可以建议,在这种情况下,如何处理多个并发的ajax请求,同时考虑web应用程序的性能?
最佳答案
每个请求都是异步的,所以发出一堆这样的请求非常快,但是伸缩性不太好。每次发出请求时,都会有一些开销过程包装每个请求。它非常小,所以几十个请求就不那么糟糕了,当它的一千个请求,乘以一百个用户(或者更糟)时,你就开始有问题了。
如果您决定继续这个方向,它很容易转换为一个请求,如果您事先计划。构建一个业务委托,以便它获取一个列表,并在拥有所有响应后调用回调。有点像
MyWS = new MyWS(); // MyWS = your web service class
function getList(list,callback){
var results = _.map(list,function(value,key){
MyWS.getStreetDetail(value,function(response){
console.log(response) // {data:{name:"LoveTree Way"...}}
results[key] = response.data;
check();
});
});
function check(){
if(_.all(results,function(value){return !!value;}))
callback(results);
}
}
list = [268,320,380];
getList(list,function(results){
alert("results",results.toSource())
});
当然,我会将getList函数直接构建到您的委托中,这样您就可以忘记它了。
new MyWS().getList([268,320,380],function(data){
console.log("data",data)
});