2012-03-29 169 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)條街道上的請求信息。 這將減少所需的請求數量...