我正在使用Angular 1.5.8。我的应用程序中的视图需要相同的3个Ajax请求的不同组合。一些视图需要来自所有三个视图的数据,其他视图需要来自两个或甚至一个端点的数据。链接多个可选的异步Ajax请求
我正在处理一个函数,该函数将管理这些数据的检索,要求应用只调用一次端点。我希望根据需要将ajax请求称为,但仅在需要时。目前我已经创建了一个可行的功能,但似乎可以使用改进。
以下功能包含在$rootScope
内。它使用fetchData()
函数根据请求循环获取请求。当数据被检索时,它被存储在全局变量$ rootScope.appData中,然后再次调用fetchData()
。当检索到所有数据时,延期承诺将被解析,并且数据将返回给控制器。
$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()
只有用户和定价数据将被要求应该是这样的:
$rootScope.loadAppData({user: true, pricing: true}).then(function(data){
//execute view logic.
});
我想知道:
- 如果这些功能的链接来完成不同?
fetchData()
功能是否足够,或者这是执行此功能的奇怪方式? - 有没有办法同时调用所有需要的Ajax请求,但在解决承诺之前等待所有需要的调用完成?
- 在
$rootScope
这样的数据存储是不寻常的吗?
我知道这个函数目前没有正确处理错误。这是我在使用此代码段之前添加的功能,但与我的问题无关。
感谢您的回答。在阅读你的答案/做更多的研究之后,对我来说很明显这个逻辑应该包含在一个服务中。我现在已经在我的项目中进行了改变。你是否知道一种方法可以并行而不是按顺序执行所有必需的调用,然后在任何调用最长的时间结束时返回结果? – kravse
使用'$ q.all'并行执行XHR。顺序方法在下一个XHR依赖于前一个XHR的信息时非常有用。一个例子是在检索用户位置之后计算运输成本。 – georgeawg