Angular Controller/Factory 以错误的顺序调用 API
Angular Controller/Factory calling API in wrong order
我有以下工厂和控制器:
(function () {
'use strict';
angular.module('app.core')
.factory('Auth', ['$http', function AuthFactory($http) {
return {
NavAuth: function (Tab) {
return $http({ method: 'GET', url: 'Dashboard/AuthorizeNavItem', params: { Name: Tab } });
}
}
}]);
})();
angular
.module('myapp')
.controller('IndexController', ['fuseTheming', 'msNavigationService', 'Auth', function (fuseTheming, msNavigationService, Auth) {
var vm = this;
//Define the tabs
msNavigationService.saveItem('app', {
title: 'QPSTool',
group: true,
weight: 1
});
msNavigationService.saveItem('app.dashboard', {
title: 'Dashboard',
icon: 'icon-tile-four',
state: 'app.dashboard',
weight: 1
});
Auth.NavAuth('IT').success(function (result) {
if (result == 'Authorized') {
msNavigationService.saveItem('app.it', {
title: 'IT',
icon: 'icon-monitor',
weight: 2
});
}
});
Auth.NavAuth('Users').success(function (result) {
if (result == 'Authorized') {
msNavigationService.saveItem('app.it.users', {
title: 'Users',
state: 'app.it.users',
weight: 1
});
}
});
Auth.NavAuth('Admin').success(function (result) {
if (result == 'Authorized') {
msNavigationService.saveItem('app.admin', {
title: 'Admin',
icon: 'icon-radioactive',
weight: 3
});
}
});
Auth.NavAuth('NavControl').success(function (result) {
if (result == 'Authorized') {
msNavigationService.saveItem('app.admin.navcontrol', {
title: 'Navigation Auth',
state: 'app.admin.navcontrol',
weight: 1
});
}
});
// Data
vm.themes = fuseTheming.themes;
}]);
NavAuth 工厂方法的作用是将导航项名称作为参数,告诉我们是否允许用户访问该项。
我遇到的问题是,当我使用 msNavigationService.saveItem
数据时,控制器中的数据以随机顺序 returned。所以它将 return 在 IT
.
之前获得 NavControl
的授权
这会导致侧边导航无法正确呈现。
如何才能让事情 运行 按照我在控制器中指定的顺序进行(即如何让它等到一个完成后再做另一个)?
如果您想按特定顺序执行承诺,请使用 .then() 触发它们。如果您希望一次完成所有操作然后适当地排序,请使用 .all() 来解决承诺,然后排序您的数据。
我认为 $q.all
无法解决您的问题,但可以通过放入承诺的 then
部分来解决,因此您可以做类似
的事情
NavAuth('IT').then(function (res) {
// doWhatever IT function does;
...
NavAuth('NavControl').then(function (res) {
// doWhatever NavControl function does;
...
})
})
使用 then
的 promise,你强制代码按顺序执行,使用 $q.all()
你不会执行所有的事情,直到你传递给 [=14= 的所有 promise ] 说完了,这不是你想要的
我有以下工厂和控制器:
(function () {
'use strict';
angular.module('app.core')
.factory('Auth', ['$http', function AuthFactory($http) {
return {
NavAuth: function (Tab) {
return $http({ method: 'GET', url: 'Dashboard/AuthorizeNavItem', params: { Name: Tab } });
}
}
}]);
})();
angular
.module('myapp')
.controller('IndexController', ['fuseTheming', 'msNavigationService', 'Auth', function (fuseTheming, msNavigationService, Auth) {
var vm = this;
//Define the tabs
msNavigationService.saveItem('app', {
title: 'QPSTool',
group: true,
weight: 1
});
msNavigationService.saveItem('app.dashboard', {
title: 'Dashboard',
icon: 'icon-tile-four',
state: 'app.dashboard',
weight: 1
});
Auth.NavAuth('IT').success(function (result) {
if (result == 'Authorized') {
msNavigationService.saveItem('app.it', {
title: 'IT',
icon: 'icon-monitor',
weight: 2
});
}
});
Auth.NavAuth('Users').success(function (result) {
if (result == 'Authorized') {
msNavigationService.saveItem('app.it.users', {
title: 'Users',
state: 'app.it.users',
weight: 1
});
}
});
Auth.NavAuth('Admin').success(function (result) {
if (result == 'Authorized') {
msNavigationService.saveItem('app.admin', {
title: 'Admin',
icon: 'icon-radioactive',
weight: 3
});
}
});
Auth.NavAuth('NavControl').success(function (result) {
if (result == 'Authorized') {
msNavigationService.saveItem('app.admin.navcontrol', {
title: 'Navigation Auth',
state: 'app.admin.navcontrol',
weight: 1
});
}
});
// Data
vm.themes = fuseTheming.themes;
}]);
NavAuth 工厂方法的作用是将导航项名称作为参数,告诉我们是否允许用户访问该项。
我遇到的问题是,当我使用 msNavigationService.saveItem
数据时,控制器中的数据以随机顺序 returned。所以它将 return 在 IT
.
NavControl
的授权
这会导致侧边导航无法正确呈现。
如何才能让事情 运行 按照我在控制器中指定的顺序进行(即如何让它等到一个完成后再做另一个)?
如果您想按特定顺序执行承诺,请使用 .then() 触发它们。如果您希望一次完成所有操作然后适当地排序,请使用 .all() 来解决承诺,然后排序您的数据。
我认为 $q.all
无法解决您的问题,但可以通过放入承诺的 then
部分来解决,因此您可以做类似
NavAuth('IT').then(function (res) {
// doWhatever IT function does;
...
NavAuth('NavControl').then(function (res) {
// doWhatever NavControl function does;
...
})
})
使用 then
的 promise,你强制代码按顺序执行,使用 $q.all()
你不会执行所有的事情,直到你传递给 [=14= 的所有 promise ] 说完了,这不是你想要的