2012-03-29 197 views
2

我在我的Web应用程序的Map中实现了“空间选择”,它选择Streets的数量。选择后,我会为使用“选择处理程序”选择的所有街道获取唯一的街道标识。在循环中发送jquery ajax请求

我的下一步是发送Ajax请求到每个街道Id的服务器并获取回应。目前,我正在使用唯一的For循环和发送每个街道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应用程序的性能?

+2

发送一个包含1000个值的ajax请求,并让它返回1000个单独的响应? – Pointy 2012-03-29 16:50:13

+0

你有一个例子req/res? – Shanimal 2012-03-29 18:51:26

回答

1

每个请求是异步的,所以它是非常快速的做出一堆这样的请求,但它不能很好地扩展。每次发出请求时,一些开销进程会包装每个请求。它非常小,所以有几十个请求不是那么糟糕,当它有一千个请求,一百个用户(或更糟糕的用户)时,你开始有问题。

如果您决定继续此方向,那么稍后将其稍后转换为一个请求即可,如果您提前计划。构建一个业务委托,以便它获取一个列表,并在具有所有响应后调用回调。类似于

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) 
}); 
+1

非常感谢。我尝试了这种方法。我比以前有更好的表现结果:-) – 2012-03-30 14:16:39

0

如果在每个请求中传递的数据量相对较小,将它们捆绑在一起可能是一个不错的主意 - 例如,在一个请求中5(或10或20)条街道上的请求信息。 这将减少所需的请求数量...