我的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)
});

10-05 18:40
查看更多