2016-03-18 2 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 
    }) 
} 

для цикла заканчивается мгновенно, так что все элементы должны вызывать 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

Смежные вопросы