2016-03-18 121 views
0

我有一個$http服務(或工廠)。同時撥打同一服務多次

angular.module("app") 
    .factory("PriceService", function ($http) { 
     return { 
      get: function (item) { 
       var url = "/pricing"; 

       return $http.post(url, item); 
      } 
     } 
    }); 

我正在閱讀Excel文件中的項目。每件物品都會打一次電話。

for (item in excelItems) { 
    console.time(item.referenceId); 
    PriceService.get(item).then(function(response) { 
     console.timeEnd(item.referenceId); 
     // process result 
    }, function() { 
     // error 
    }) 
} 

for循環結束瞬間,讓所有項目應該叫PriceService幾乎在同一時間。但是,似乎這些項目正在陸續調用服務。請查看控制檯時間結果(左欄是refereceId)。

3: 2283.264ms 
    5: 3167.943ms 
    2: 3327.372ms 
    11: 3767.073ms 
    12: 3849.267ms 
    14: 5388.853ms 
    8: 15996.263ms 
    16: 16636.952ms 
    4: 17689.306ms 
    18: 18190.733ms 
    15: 19323.512ms 
    20: 20009.020ms 
    13: 23326.644ms 
    10: 23378.259ms 
    22: 24077.294ms 
    24: 24568.147ms 
    total: 24570.348ms 

有沒有什麼辦法可以改善這一點?非常感謝!

+3

如果我的理解對不對您的要求在同一時間運行的東西呢?如果是這樣,JavaScript是單線程的。什麼都不會發生在別的什麼地方。 – ste2425

+0

@ ste2425謝謝。你有什麼建議來改善這個嗎? – NMSL

+0

不過分。你只是打網絡電話,這樣你就會在網絡上有所延誤。在您收到回覆後您的記錄,您事後沒有考慮到您的處理。您可以對客戶端進行微型優化,但如果您遇到性能問題,則會在此處顯示服務器上正在發生的一切。 – ste2425

回答

1

您可以使用不同的方法。 如果每個請求冪等您可以通過這種方式使用$ Q模塊:

var promises = []; 
for (item in excelItems) { 
    promises.push(PriceService.get(item)); 
} 
$q.all(promises).then(function(results){ 
    //Ok 
}, function(error){ 
    console.log(error); 
}); 
+0

感謝您的回答。這是一個不錯的選擇。我們決定在中間層做一些改進。 – NMSL