AngularJS: одновременный $ http get возвращает неверные данные в $ .each loop

Я пытаюсь получить данные для нескольких идентификаторов, например:

(Сильно упрощенно, но я надеюсь, что смогу четко указать)

контроллер:

var idList = [39,40,41]; $.each(idList, function(key, value){ var dataObject = { type: "test", id: value }; var getData = DataFactory.get(dataObject); getData.then(function(result){ console.log(result); } }); 

Фабрика:

 app.factory("DataFactory", ['$http', '$rootScope', function($http, $rootScope){ url = 'http://url/api'; var obj = {}; obj.get = function(object){ return $http({ method: 'GET', params: object, url: url }) .then(function(results){ return results.data; }); }; return obj; } ]); 

Backend:

 <?php $id = $_GET['id']; $type = $_GET['type']; echo json_encode(array("id": $id, "type": type, "value": "value matching id ".$id)); ?> 

Если idList равен 1 целому числу, возвращаемые данные соответствуют id, например:

 {id: 39, type: "test", value: "value matching id 39"} 

Однако при применении нескольких значений в idList возвращаемые данные не применяются к правильному идентификатору:

 {id: 39: type: "test", value: "value matching id 41"} {id: 40: type: "test", value: "value matching id 39"} {id: 41: type: "test", value: "value matching id 40"} 

Я ожидал, что, если я отправлю обратно тот же ID, значение, соответствующее этому ID, будет правильным. Это не тот случай. Есть ли способ правильно привязать идентификатор к правильному значению соответствия?

Изменить: если посмотреть на вкладку сети в хроме, произойдет следующее:

Для 1 id

 url: api?id=39&type=test result(preview): data: [id: 39, type: test, value: 'value matching id 39'] 

Для 3-х знатных

 url: api?id=39&type=test (same for 40 and 41) result(preview): data: [id: 39, type: test, value: 'value matching id 40'] 

Это почти похоже на то, что php не обрабатывает запросы должным образом. Открытие api url ( http: // url / api? Id = 39 & type = test ) всегда дает мне ожидаемый результат. Вызов api несколько раз из javascript дает мне смешанные результаты.

Его взгляд в порядке, возможно, PHP не идентифицирует действие «GET».

Вы пытались поместить console.log на фабрике, чтобы увидеть, правильно ли используется URL? (и его хорошо видеть в сети).

И вы также можете сделать «плохой способ» (просто проверить), поместив URL жестко закодированным следующим образом:

 url: url + "?id=" + object.id + "&type=" + object.type 

Если у вас возникла эта проблема в java при использовании весенней конфигурации с трикотажем, проблема может быть вызвана одноэлементным характером ресурса при пометке с помощью @component. Когда приходит новый запрос, тот же компонент используется со старыми введенными значениями для запроса, параметров заголовка и других бизнес-объектов. Это означает, что он будет извлекать данные с использованием старых значений.

Один из способов исправить это – использовать область прототипа в классе ресурсов, чтобы получить новый экземпляр со свежей инъекцией каждый раз, когда есть запрос: @Scope("prototype") или изменить подпись метода get, чтобы все необходимые ему значения такие как параметры, вводимые в методе, а не в объект.

Второй вариант лучше, потому что экземпляр будет использоваться повторно, и только параметры будут меняться для каждого вызова метода.

Вместо этого

 @QueryParam("searchTerm") private String searchTerm; @GET private Product findProduct() { productDao.find(searchTerm); } 

Сделай это

 @GET private Product getProduct(@QueryParam("searchTerm") String searchTerm) { productDao.find(searchTerm); }