0

需要您幫助減少應用程序的加載時間。在我們的應用程序中,我們使用ngroute和ng-route來解析調用。一旦解析調用成功,我們正在進行其他函數調用。每個函數調用都是獲取數據的單個資源調用。現在,請檢查下面的代碼如何處理ngRoute視圖加載角度js上的多個資源調用

$routeProvider.when('/friends/search', { 
    controller: 'FriendsSearchController', 
    controllerAs: 'fsvm', 
    templateUrl: 'friends/search/friends-search.html', 
    resolve: { 
     initFriendData: getFriendsList 
    } 
}); 

function init() { 
    if(initFriendData) { 
     if(initFriendData.success) { 
      getToolBoxes(); 
      getFamilyData(); 
     } 
    } 
} 
init(); 

function getToolboxes() { 
    var promise = friendLandingService.getUserInfo(); 
     promise.then(function (result) { 
      _this.userData = result.data; 
     }, function (error) { 
      console.log(error); 
     }); 
} 

function getFamilyData() { 
    var promise = friendLandingService.familyInfo(); 
     promise.then(function (result) { 
      _this.familyData = result.data; 
     }, function (error) { 
      console.log(error); 
     }); 
} 

現在,如果你看到我有兩個功能,這使保證通話和獲取數據。這很好,但問題在於,當調用需要時間時,頁面上顯示的數據會出現延遲。繼續前進如何在解析函數中包含多個調用,因爲我無法繼續添加函數。有人能告訴我如何改變這種解決方式嗎?我需要頁面加載信息我無法改變,但如何解決這個多個函數。對不起,但我不得不精確的在我的問題:)

回答

1

要執行的一個決心函數的所有三個數據獲取,使用$q.all

$routeProvider.when('/friends/search', { 
    controller: 'FriendsSearchController', 
    controllerAs: 'fsvm', 
    templateUrl: 'friends/search/friends-search.html', 
    resolve: { 
     initData: ["$q", "friendLandingService" function($q,service) { 
      return initDataPromise($q, service); 
     })] 
    } 
}); 

function initDataPromise($q, service) { 
    var promiseHash = {}; 
    promiseHash.friendData = service.getFriendInfo() 
     .then(function(result) { 
     return result.data; 
    }); 
    promiseHash.familyData = service.getFamilyInfo() 
     .then(function(result) { 
     return result.data; 
    }); 
    promiseHash.userInfo = service.getUserInfo() 
     .then(function(result) { 
     return result.data; 
    }); 
    return $q.all(promiseHash); 
} 

initData對象將與所有三組數據解決之前的觀點呈現給DOM。

AngularJS $q Service與其他承諾庫區別開來的一個方面是它的$q.all方法適用於JavaScript對象哈希(關聯數組)。

然後在控制器:

app.controller("FriendsSearchController", ["initData", function(initData) { 
    this.friendData = initData.friendData; 
    this.familyData = initData.familyData; 
    this.userInfo = initData.userInfo; 
}]); 
+0

感謝您的回答。我會試一試,我會看看它是否會增加DOM加載。 –

1

你沒有使用承諾,他們的全部潛力。如果不是讓您的兩個函數用於加載數據(getToolboxes()和getFamilyData())將一個本地var設置爲承諾,您可以讓它們返回承諾。然後在init方法中,可以使用Promise.all()。then()來並行運行promise。

看看谷歌提供的承諾文檔,它真的幫助我弄清楚如何使用承諾充分發揮潛力。 https://developers.google.com/web/fundamentals/getting-started/primers/promises

+0

感謝您的回答,但我沒有在你的答案瞭解一點「一個局部變量設置爲承諾,你可以讓他們返回的承諾。」你能解釋這個聲明嗎? –

+0

肯最後一個問題讓我說我有兩個路線,他們都承載相同的信息頁面加載。我們是否可以儲存在一條路線上加載的信息,並將其載入其他路線,這樣我就不需要再次撥打電話了? –

+1

對於你的第一個問題,你似乎沒有按照慣例使用承諾。您將承諾分配給本地變量,然後處理它。我猜這是爲了讓承諾運行而不實際處理是異步的,但那麼你的問題是要求使這個運行異步,所以它的混淆。 對於第二個問題,如果數據沒有在頁面之間更新,並且可以在本地進行緩存而不用擔心沒有最新的數據,那麼您可以使用localStorage來保存頁面之間的數據。檢出localStorage.setItem()和localStorage.getItem()。 – Ken