我有一个基于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调用通常在不同的控制器中进行,因此结果存储在不同的范围内。
基本上,我很困惑那些逻辑应该放在控制器,服务本身还是其他地方。任何建议表示赞赏。谢谢。
答案 0 :(得分:1)
如果您在控制器中比较它们,您可以轻松地调用一个,然后另一个并进行比较。既然你说你有一个“基于API的应用程序”并使用来自localStorage的身份验证令牌,那么你应该在你拥有的身份验证令牌过期的每个不同的控制器中调用API。
我很可能会创建一个类似的服务(将其刷新以显示所有部分):
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
});
答案 1 :(得分:0)
您应该使用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);