【发布时间】:2016-12-05 18:59:45
【问题描述】:
我正在使用 Angular 1.5.8。我的应用程序中的视图需要相同的 3 个 ajax 请求的不同组合。一些视图需要来自所有三个端点的数据,其他视图需要来自两个甚至一个端点的数据。
我正在开发一个函数来管理这些数据的检索,要求应用程序只调用每个端点一次。我希望 根据需要调用 ajax 请求,但仅在需要时调用。目前我已经创建了一个有效的功能,但似乎它可以使用改进。
$rootScope 中包含以下函数。它使用fetchData() 函数根据请求循环获取请求。检索数据时,将其存储在全局变量 $rootScope.appData 中,然后再次调用 fetchData()。当所有数据都被检索到时,deferred Promise 被解析并且数据被返回给控制器。
$rootScope.appData = {};
$rootScope.loadAppData = function(fetch) {
var deferred = $q.defer();
function getUser() {
$http
.get('https://example.com/api/getUser')
.success(function(result){
$rootScope.appData.currentUser = result;
fetchData();
});
}
function getPricing() {
$http
.get('https://example.com/api/getPricing')
.success(function(result) {
$rootScope.appData.pricing = result;
fetchData();
});
}
function getBilling() {
$http
.get('https://example.com/api/getBilling')
.success(function(result) {
$rootScope.appData.billing = result;
fetchData();
});
}
function fetchData() {
if (fetch.user && !$rootScope.appData.currentUser) {
getUser();
} else if (fetch.pricing && !$rootScope.appData.pricing) {
getPricing();
} else if (fetch.billing && !$rootScope.appData.billing) {
getBilling();
} else {
deferred.resolve($rootScope.appData);
}
}
if ($rootScope.appData.currentUser && $rootScope.appData.pricing &&$rootScope.appData.billing) {
deferred.resolve($rootScope.appData);
} else {
fetchData();
}
return deferred.promise;
};
一个对象fetch作为一个属性提交,这个对象显示了要调用的ajax请求。对 $rootScope.loadAppData() 的示例调用,其中仅请求 user 和 pricing 数据,如下所示:
$rootScope.loadAppData({user: true, pricing: true}).then(function(data){
//execute view logic.
});
我想知道:
- 是否应该以不同的方式链接这些函数?
fetchData()功能是否足够,或者这是执行此功能的奇怪方式? - 有没有办法同时调用所有需要的 Ajax 请求,但在解决承诺之前等待所有需要的调用完成?
- 在
$rootScope中存储这样的数据是否异常?
我知道这个函数目前没有正确处理错误。这是我将在使用此 sn-p 之前添加的功能,但与我的问题无关。
【问题讨论】:
标签: javascript angularjs asynchronous promise q