我正在使用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