2017-06-23 3 views
0

J'ai un frontend AngularJS à mon application basée sur l'API. Il existe des services qui effectuent des appels d'API, tels que les suivants. Je veux comparer une variable de chacun de ces appels:La meilleure façon de comparer deux appels d'API dans angularJS?

Obtenir les données utilisateur:

this.getUserData = function() { 
var apiCall = $http({ 
    method: 'GET', 
    url: 'http://example.com/api/userdata', 
    headers: { 
     'Authorization': 'Bearer ' + localStorage.getItem('token'), 
     'Access-Control-Allow-Origin': 'Any' 
    } 
}); 
return apiCall; 
}; 

Obtenir les données de la page:

this.getPageData = function(slug){ 
    var apiCall = $http.get('http://example.com/api/public/page?slug=' + slug, { 
     headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') } 
    } 
) 
    return apiCall; 
}; 

Dans mon contrôleur je voudrais comparer un var de chacun de ces appels, comme suit:

if (apiService.getUserData.likes.page_id == apiService.getPageData.page_id){ // do stuff } 

Quelle est la manière la plus efficace de le faire, étant donné que les appels API peuvent prendre un moment .. Je ne dois pas faire un appel d'API chaque fois que je veux accéder à une variable de l'API puis-je? Gardez à l'esprit que ces appels d'API sont normalement effectués dans les contrôleurs DIFFERENT, de sorte que les résultats sont stockés dans des portées différentes. Fondamentalement, je suis confus si ce peu de logique devrait aller dans un contrôleur, dans le service lui-même, ou ailleurs. Tout conseil est apprécié. Merci.

Répondre

1

Si vous les comparez dans un contrôleur, vous pouvez facilement appeler l'un suivi de l'autre et comparer. Puisque vous dites que vous avez une "application basée sur l'API" et utilisez un jeton d'authentification de localStorage, vous devez appeler l'API dans chaque contrôleur différent au cas où votre jeton d'authentification expire ou quelque chose comme ça.

Je probablement créer un service comme (chasse dehors à plus de montrer toutes les pièces):

angular.module('app').service('CompareService', CompareService); 

CompareService.$inject = ['apiService', '$q']; 

function CompareService(apiService, $q) { 
    return { 
     arePageIdsEqual: apie 
    };   

    function apie() { 
     var deferred = $q.defer(); 

     apiService.getUserData().$promise.then(function(userData) { 
      apiService.getPageData().$promise.then(function(pageData) { 
       deferred.resolve(userData.likes.page_id === pageData.page_id); 
      }, function(err) { 
       deferred.reject(err); 
      }); 
     }, function(err) { 
      deferred.reject(err); 
     });  

     return deferred.promise; 
    } 
} 

Et dans votre contrôleur juste injecter et l'appeler comme:

CompareService.arePageIdsEqual(function(yes) { 
    if(yes) { 
     // do something 
    } 
}, function(err) { 
    // err making the calls 
}); 
+0

Très agréable! Pour être clair, cela signifie que j'appelle chaque route de l'API plusieurs fois dans mon application - une fois pour obtenir les données d'API dont j'ai besoin pour le contrôleur, et encore chaque fois j'ai besoin de comparer les variables. Est-ce conseillé? – Leon

+1

cela dépend de votre application. Si vous avez déjà besoin des données dans votre contrôleur, vous devez appeler getUserData et getPageData puis, une fois qu'elles reviennent, faites votre comparaison. Si vous avez juste besoin du vrai/faux de la comparaison, utilisez un service comme celui-ci. La troisième option est sur votre côté serveur, vous pouvez définir un indicateur sur les données utilisateur comme userData.hasLikedPage et vous n'avez pas à comparer sur l'interface utilisateur – Ero

0

Vous devez l'implémenter avec Promise.all.

function doCompare(userData,pageData){ 
    if (userData.likes.page_id == pageData.page_id){ 
    // do stuff 
    } 
} 

var promises = [apiService.getUserData,apiService.getPageData] 
$q.all(promises).then(doCompare);