Comment faire des requêtes AJAX synchrone dans AngularJS contrôleur
J'ai dit que $http Angulaire est asynchrone. Toutefois, pour un certain but, j'ai besoin de faire séquentielle des requêtes AJAX.
Je veux lire tous les fichiers à partir d'une liste de fichiers, puis obtenir le nombre de tous ces fichiers. Par exemple:
contenu de "nom":
file1
file2
contenu de "fichier1":
1
contenu de "fichier2":
2
Le code suivant calcule la somme
<!DOCTYPE html>
<html>
<body>
<p id="id01"></p>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
var fileString;
/* first AJAX call */
$.ajax({
url: 'fileNames', type: 'get', async: false,
success: function(content) {
fileString = content;
}
});
var fileList = fileString.split('\n');
var sum = 0;
for (var i = 0; i < fileList.length; i++) {
/* second AJAX call in getNumber function */
sum += getNumber(fileList[i]);
}
document.getElementById("id01").innerHTML = sum;
function getNumber(file) {
var num;
$.ajax({url: file, type: 'get', async: false,
success: function(content) {
num = content;
}
});
return parseInt(num);
}
</script>
</body>
</html>
Depuis les deux $.les appels ajax sont séquentiels, je ne sais pas comment obtenir cette fonctionnalité dans AngularJS. Dire, en fin de compte, je veux $champ d'application.somme = 1 + 2.
Quelqu'un peut le faire fonctionner en AngularJS? Un code simple serait appréciée!
j'ai écrit une usine à ce sujet, check it out lien
OriginalL'auteur lys1030 | 2015-06-10
Vous devez vous connecter pour publier un commentaire.
Vous pourriez faire usage de promesses et de promesse de chaînage (avec
$q
et la promesse retourné par$http
). Exemple: Dans votre contrôleur, vous pourriez faire (après l'injection$http
,$q
):Voir aussi:
Cela ne signifie pas que les appels synchrones, mais ils sont asynchrones et toujours fait ce que vous avez besoin d'une façon plus efficace et facile à gérer.
Démo
vous êtes les bienvenus. Je dirais plutôt que d'adopter la solution est de l'essayer vous-même, lisez la documentation pour mieux comprendre . Tous les meilleurs
Il semble $http.get(fichier).alors, (...) ne fonctionne pas pour les fichiers json. Pourriez vous s'il vous plaît voir cette démo? lien. Merci à l'avance!
OriginalL'auteur PSL
Les autres réponses montrent comment utiliser correctement les $http de manière Asynchrone à l'aide de promesses ou de ce qui est aussi appelé le chaînage, et que c'est la bonne façon d'utiliser $http.
En essayant de le faire de manière Synchrone comme vous l'avez demandé va bloquer le Contrôleur de cycle qui est quelque chose que vous voulez jamais faire.
Encore, vous pouvez faire la chose terrible de vérification de l'état de promesse dans une boucle. Qui peut être fait par le
$$state
propriété de la promesse qui a une propriété nomméestatus
OriginalL'auteur n00b
Vous pouvez utiliser la promesse qui est retourné par $http appels de méthode:
Lorsque vous retournez une promesse dans un
then
rappel de la prochainethen
ne sera pas appelé jusqu'à la promesse a été résolu.Angulaire de $q(reportées ou promesse) de service
OriginalL'auteur Patrick Evans
Il est possible angulaire http fonctions à l'aide de promesses. E. G:
OriginalL'auteur Sir Neuman