web-dev-qa-db-fra.com

Angularjs promet, $ q, reporter

ÉDITER

La première réponse est l'élégante, mais, comme indiqué à quelques reprises dans cette question et une autre question sur Stackoverflow, le problème est que le service et le contrôleur exécutent leur truc avant que les données n'arrivent réellement.

(Dernier commentaire sur la première réponse :)

Oui, le problème est que les appels API finissent après que le service fonctionne et renvoie tout au contrôleur, voir ici ScreenCast.com/t/urkmz1igpb7 ... C'est ma question de base, comment pourrais-je attendre sur toutes les pièces pour les données arrivée?

C'est comme si je le dise à répéter, Comment faire un service qui remplit le tableau après la récupération de données réussie et le contrôleur reçoit des données après tout cela, car comme vous pouvez le voir dans mon Capture d'écran, les choses courent dans un ordre différent.


J'ai ce code:

 var deferred = $q.defer();
            $http.get('../wordpress/api/core/get_category_posts/?category_id=14 ').success(function(data) {
                //we're emptying the array on every call
                theData = [];
                catName = data.category.slug;
                theData = data;
                theData.name = catName;
                aggregatedData.Push(theData);
            });
            $http.get('../wordpress/api/core/get_category_posts/?category_id=15 ').success(function(data) {
                theData = [];
                catName = data.category.slug;
                theData = data;
                theData.name = catName;
                aggregatedData.Push(theData);
            });
            $http.get('../wordpress/api/core/get_category_posts/?category_id=16 ').success(function(data) {
                theData = [];
                catName = data.category.slug;
                theData = data;
                theData.name = catName;
                aggregatedData.Push(theData);
            });
            $http.get('../wordpress/api/core/get_category_posts/?category_id=17 ').success(function(data) {
                theData = [];
                catName = data.category.slug;
                theData = data;
                theData.name = catName;
                aggregatedData.Push(theData);
            });
            //deferred.resolve(aggregatedData);
            $timeout(function() {
                deferred.resolve(aggregatedData);
            }, 1000);
            /*//deferred.reject('There is a connection problem.');
            if (myservice._initialized) {
                $rootScope.$broadcast('postsList', deferred.promise);
            }*/
            //myservice._initialized = true;
            myservice = deferred.promise;
            return deferred.promise;

Pour la vie de moi, je ne comprends pas pourquoi dois-je mettre un délai d'attente lorsque vous passez la matrice résultante à reporter?

Le principe ne devrait-il pas être comme si de la diffusion de l'information à venir puis de retourner la promesse? Quel est le point de cela 1 seconde là-bas? De ce que je crois comprendre que la diffusion devrait être capable d'attendre tant que nécessaire pour que l'API renvoie le résultat et le retour des données promises.

Je suis vraiment confus, j'ai frappé ma tête contre les murs pendant les deux dernières heures car je ne recevais aucune donnée dans mon contrôleur, seulement lorsque je posai ce délai d'attente là-bas.

16
Arthur Kovacs

Les $http.get Les appels sont asynchronisés, mais vous n'attendez pas avant qu'ils ne soient tous terminés avant de résoudre le différé. Ici, cela fonctionne avec le délai d'attente simplement parce que vous avez de la chance que les appels ont le temps de terminer dans une seconde de 1 seconde, mais ce n'est pas fiable du tout.

Je ne réitérerai pas une solution complète ici, mais je vais regarder ma réponse pour un autre problème similaire.

11
plalx