如何处理ngRoute视图加载角度js上的多个资源调用
需要您帮助减少应用程序的加载时间。在我们的应用程序中,我们使用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);
});
}
现在,如果你看到我有两个功能,这使保证通话和获取数据。这很好,但问题在于,当调用需要时间时,页面上显示的数据会出现延迟。继续前进如何在解析函数中包含多个调用,因为我无法继续添加函数。有人能告诉我如何改变这种解决方式吗?我需要页面加载信息我无法改变,但如何解决这个多个函数。对不起,但我不得不精确的在我的问题:)
要执行的一个决心函数的所有三个数据获取,使用$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;
}]);
你没有使用承诺,他们的全部潜力。如果不是让您的两个函数用于加载数据(getToolboxes()和getFamilyData())将一个本地var设置为承诺,您可以让它们返回承诺。然后在init方法中,可以使用Promise.all()。then()来并行运行promise。
看看谷歌提供的承诺文档,它真的帮助我弄清楚如何使用承诺充分发挥潜力。 https://developers.google.com/web/fundamentals/getting-started/primers/promises
感谢您的回答,但我没有在你的答案了解一点“一个局部变量设置为承诺,你可以让他们返回的承诺。”你能解释这个声明吗? –
肯最后一个问题让我说我有两个路线,他们都承载相同的信息页面加载。我们是否可以储存在一条路线上加载的信息,并将其载入其他路线,这样我就不需要再次拨打电话了? –
对于你的第一个问题,你似乎没有按照惯例使用承诺。您将承诺分配给本地变量,然后处理它。我猜这是为了让承诺运行而不实际处理是异步的,但那么你的问题是要求使这个运行异步,所以它的混淆。 对于第二个问题,如果数据没有在页面之间更新,并且可以在本地进行缓存而不用担心没有最新的数据,那么您可以使用localStorage来保存页面之间的数据。检出localStorage.setItem()和localStorage.getItem()。 – Ken
感谢您的回答。我会试一试,我会看看它是否会增加DOM加载。 –