比较angularJS中两个API调用的最佳方法?

比较angularJS中两个API调用的最佳方法?,angularjs,service,api-design,Angularjs,Service,Api Design,我的基于API的应用程序有一个AngularJS前端。有一些服务可以进行API调用,例如以下服务。我想比较每个调用中的一个变量: 获取用户数据: this.getUserData = function () { var apiCall = $http({ method: 'GET', url: 'http://example.com/api/userdata', headers: { 'Authorization': 'Bearer ' + localStorage.

我的基于API的应用程序有一个AngularJS前端。有一些服务可以进行API调用,例如以下服务。我想比较每个调用中的一个变量:

获取用户数据:

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;
};
获取页面数据:

 this.getPageData = function(slug){
     var apiCall = $http.get('http://example.com/api/public/page?slug=' + slug, {
      headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }
    }
  )
  return apiCall;
};
在我的控制器中,我希望比较每个调用的var,如下所示:

    if (apiService.getUserData.likes.page_id == apiService.getPageData.page_id){ // do stuff } 
考虑到API调用可能需要一段时间,最有效的方法是什么。。我不必每次从API访问变量时都进行API调用,是吗?请记住,这些API调用通常在不同的控制器中进行,因此结果存储在不同的作用域中


基本上,我不知道这些逻辑应该放在控制器、服务本身还是其他地方。任何建议都将不胜感激。谢谢

如果您在控制器中比较它们,您可以很容易地依次调用其中一个并进行比较。既然您说您有一个基于API的应用程序,并且使用来自localStorage的auth令牌,那么您应该在每个不同的控制器中调用该API,以防auth令牌过期或发生其他情况

我很可能会创建一个服务,比如将其刷新到更多,以显示所有片段:

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;
    }
} 
在您的控制器中,只需注入它,然后像这样调用它:

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

你应该用承诺来实现它

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);

很不错的!需要明确的是,这意味着在我的应用程序中多次调用每个API路由——一次是为了获取控制器所需的API数据,另一次是每次需要比较变量时。这明智吗?这取决于你的申请。如果您已经需要控制器中的数据,您应该调用getUserData和getPageData,然后在它们都返回后进行比较。如果您只需要比较中的真/假,请使用如下服务。第三个选项是在服务器端,您可以在userData上设置一个标志,如userData.hasLikedPage,然后不必在UI上进行比较