AngularJS: $ http simultané renvoie des données incorrectes en $ .each loop

J'essaie de récupérer des données pour plusieurs ID comme ceci:

(Fortement simplifié, mais j'espère pouvoir préciser mon point de vue)

Manette:

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

Usine:

 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)); ?> 

Si l'idList est 1 entier, les données renvoyées correspondent à l'identifiant, par exemple:

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

Cependant, lors de l'application de plusieurs valeurs dans l'idList, les données renvoyées ne sont pas appliquées à l'identifiant correct:

 {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"} 

Je m'attendais à ce que si je renvoyais le même identifiant, la valeur correspondant à cette identification serait correcte. Ce n'est pas le cas. Existe-t-il une façon de lier correctement l'ID à la valeur correspondante correcte?

Modifier: en regardant l'onglet réseau dans Chrome, il se produit ce qui suit:

Pour 1 ID

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

Pour 3 ID

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

Il semble presque que php ne traite pas correctement les requêtes. L'ouverture de l'URL de l'api ( http: // url / api? Id = 39 & type = test ) me donne toujours le résultat attendu. Appeler plusieurs fois l'api depuis javascript me donne des résultats mitigés.

Son aspect correct, c'est peut-être que le PHP n'identifie pas l'action "GET".

Avez-vous essayé de mettre un console.log en usine pour voir si prend la bonne url? (Et il est bon de voir le réseau).

Et vous pouvez également faire dans le "mauvais chemin" (juste pour tester), mettant l'url codé comme ceci:

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

Dans le cas où vous rencontrez ce problème dans java lors de l'utilisation de la configuration du ressort avec le jersey, le problème peut être causé par la nature unique de la ressource lorsqu'elle est marquée par @component. Lorsqu'une nouvelle demande arrive, le même faisceau est utilisé avec les anciennes valeurs injectées pour la requête, les paramètres d'en-tête et d'autres objets métier. Cela signifie qu'il va chercher des données en utilisant de vieilles valeurs.

Une façon de le résoudre est d'utiliser la portée du prototype sur la classe de ressource pour obtenir une nouvelle instance avec une nouvelle injection chaque fois qu'il y a une demande: @Scope("prototype") ou pour modifier la signature de la méthode get afin que toutes les valeurs dont elle a besoin Tels que les paramètres sont injectés à la méthode plutôt que dans l'objet.

La deuxième option est meilleure car l'instance sera réutilisée et seuls les paramètres changeront pour chaque appel de méthode.

Au lieu de cela

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

Faire cela

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