1

J'essaie de créer un service js angulaire qui récupérera les données du serveur si une mise à jour est nécessaire ou retournera un tableau mis en cache s'il n'y a pas de mise à jour. Dans les deux cas, le service doit renvoyer un promise. Code de service:Réponse du serveur de cache (AngularJS, différée)

getLikesForMe = function() { 
    var defer = $q.defer(), prom = defer.promise; 

    if (angular.isUndefined(this.likesForMe) || 
     updateStatus.likesForMe === true) { 
     var that = this; 

     prom = $http.get(API_URL + 'likes-to.json') 
     .then(function(result){ 
      updateStatus.likesForMe = false; 
      that.likesForMe = result.data; 
     }); 

    } else { 
     defer.resolve(this.likesForMe); 
    } 

    return prom; 
    } 

Code contrôleur actuel:

MainUser.getLikesForMe().then(function(result) { 
    $scope.likesList = result; 
}); 

code du contrôleur Prefered:

$scope.likesList = MainUser.getLikesForMe(); 

Mais actuellement il ne fonctionne que après la deuxième fonction (getLikesForMe()) appel, le premier - la La liste est vide et la variable "result" est undefined. Je suis novice en matière d'objets différés et mon anglais est assez pauvre, mais j'espère que vous comprenez où est l'erreur. Merci beaucoup!

Répondre

3

Vous avez 2 numéros

  • Au premier appel, la promesse que vous revenez sera résolu avec undefined que vous n'êtes pas tout retour de la fonction de rappel de succès then de votre appel à $http.get. Si vous renvoyez that.likesForMe à partir de ce rappel, je suppose que cela fonctionnera comme prévu. Vous devriez probablement lire sur les promesses d'enchaînement. (Shameless plug: J'ai écrit un blog post on AngularJS promises qui contient des sections sur enchaînant)

  • Le code est assez compliqué pour ce qu'il fait, et vous avez presque jamais de créer une promesse via $q.defer() si tout ce que vous faites pour travailler avec promesses existantes. Cela rend généralement les choses plus compliquées et plus difficiles à gérer. Vous pouvez également utiliser $q.when() pour créer une promesse à partir d'une valeur non promise. Je propose donc quelque chose comme

    getLikesForMe = function() { 
        var that = this; 
        var useCache = !updateStatus.likesForMe && !angular.isUndefined(this.likesForMe); 
    
        return useCache ? $q.when(that.likesForMe) : $http({ 
        method: 'GET', 
        url: API_URL + 'likes-to.json' 
        }).then(function(results) { 
        updateStatus.likesForMe = false; 
        that.likesForMe = results.data; 
        return that.likesForMe; 
        }); 
    }); 
    

Vous pouvez également lire dans le docs for $http cache pour voir si vous pouvez trouver une solution qui l'utilise.

+0

Excellente solution. Merci beaucoup! P.S. Je voudrais certainement lire votre article de blog. ;) –

0

Si vous préférez la version ultérieure du code du contrôleur, vous ne pouvez pas retourner une promesse du service.

Vous pourriez renvoyer un objet vide qui serait augmenté lorsque vous reviendriez de l'appel http.

Vous devrez alors émettre un $rootScope.$apply() afin que votre contrôleur soit averti.