Comment obtenir les multiples résultats de la demande HTTP dans mon exemple?

J'essaie de faire une requête HTTP et de placer le résultat renvoyé dans mon tableau.

J'ai quelque chose comme

Ctrl

for (var i=0; i < numOfProduct.length; i++) { productFactory.makeRequest(numOfProduct[i].id) .then(function(data) { console.log(i) //always output 10 which is my numOfProduct.length numOfProduct[i].push({detail: data}); //i got Cannot read property 'push' of undefined error }) $scope.numOfProduct = numOfProduct; } 

ProductFactory

 service.makeRequest = function(id) { return $http.get('/api/product/get' + id); } return service; 

Mon objectif est de pousser un résultat de demande http dans chacun des éléments numOfProduct comme objet. Cependant, je ne peux pas sembler le faire avec les codes de demande http que j'ai. Quelqu'un peut-il m'aider à ce sujet? Merci beaucoup!

Vous avez deux problèmes avec ce qui précède:

1 est un problème de rappel commun où vous liez une référence à i mais pas à la valeur de i . Ainsi, au moment où votre rappel sera appelé, la boucle aura terminé et i serai 10 dans tous les rappels que vous avez liés.

Une façon de résoudre ce problème consiste à forcer l'évaluation de i par un appel de fonction:

 function makeCallback(productId) { productFactory.makeRequest(productId) .then(function(data) { console.log(i) return ({detail: data}); }); } 

Le deuxième problème est que vous appelez .push sur une valeur spécifique dans le tableau numOfProduct au lieu d'un tableau réel. (Sauf si cette valeur spécifique est un tableau, je suppose que ce n'est pas parce que vous appelez .id sur la valeur)

Essayez ceci à la place:

 function makeCallback(productId) { productFactory.makeRequest(productId) .then(function(data) { console.log(i) return ({detail: data}); }) } var array = []; for (var i=0; i < numOfProduct.length; i++) { array.push(makeCallback(numOfProduct[i].id)); } $scope.numOfProduct = array; 

Si chaque boucle est exécutée de manière asynchrone, je suggère d'utiliser la bibliothèque populaire asynchrone . Faites-moi savoir si vous avez besoin d'aide pour configurer ceci.