Restangular ui.router 解析异步或同步

Restangular ui.router resolve asynchronous or synchronous

我正在使用 Restangular 和 ui.router。

下面是我的代码。

app.config(["$urlRouterProvider", "$stateProvider", "$locationProvider","RestangularProvider",
            function ($urlRouterProvider, $stateProvider, $locationProvider, RestangularProvider ) {
                $urlRouterProvider.otherwise("/");
                $stateProvider
                    //
                    .state("home", {
                        url: "/",
                        templateUrl: 'app/class/html/classList.html',
                        controller: 'ClassSectionListCtrl as vm',
                    resolve: {
                        acYear: function (Restangular, $stateParams) {
                            return Restangular.all('currentYear').getList();
                        },
                        classSectionSubjectMatrix: function (Restangular, $stateParams) {
                            return Restangular.all('classSectionSubjectMatrix').getList();
                    }

                }

我有两个解析 return acYear & classSectionSubjectMatrix。我的问题是,acYearclassSectionSubjectMatrix 同时触发(并行)或者它会按顺序触发(首先 acYear 然后 classSectionSubjectMatrix)?

其次,有什么方法可以在我的控制器中捕获 acYearclassSectionSubjectMatrix 从开始到结束独立花费的时间?

像这样。

acYear                          ---> 0%....10%.....30%........60%.......100%
classSectionSubjectMatrix       ---> 0%...........50......100%

RestangularProvider.addResponseInterceptor(
                    function (data, operation, what, url, response, deferred) {
                        pendingRequests--;
                        if (pendingRequests == 0) {
                            console.log('loaded data2 (hide indicator)' + JSON.stringify(what));
                        }
                        return data;
                    });

首先你没有在状态解析上解决任何问题...

如果你想通过承诺我相信使用服务会更好。所以我假设你想解决关于状态解析的承诺,并且 return 将对象解析为控制器。

解析变量之间没有顺序除非其中之一依赖于其他变量。 这意味着在这种情况下,您可以认为两者都将在 同时开始

resolve: {
            acYear: function (Restangular, $stateParams) {
               return Restangular.all('currentYear').getList().then(function(response){
                  return response;
               });
            },
            classSectionSubjectMatrix: function (Restangular, $stateParams) {
               return Restangular.all('classSectionSubjectMatrix').getList().then(function(response){
                  return response;
               });
            }
}

但如果其中一个依赖于其他它应该等待依赖值首先解决

resolve: {
            acYear: function (Restangular, $stateParams) {
               return Restangular.all('currentYear').getList().then(function(response){
                  return response;
               });
            },
            classSectionSubjectMatrix: function (acYear, Restangular, $stateParams) {
               return Restangular.all('classSectionSubjectMatrix').getList().then(function(response){
                  return response;
               });
            }
}

在这个 acYear 中应该首先解决,然后将对 classSectionSubjectMatrix...

提出第二个请求

对于第二个问题,当你在状态中解决它们时,你无法计算控制器上的时间...

第一个问题的答案:

My question is, both acYear & classSectionSubjectMatrix trigger at same time (parallel) or it will in sequential manner (first acYear then classSectionSubjectMatrix) ?

它们并行执行,彼此独立。为了按顺序分配它们,您需要利用承诺 API 并相应地构建您的 then-able 逻辑。

第二个问题的答案:

Second,is there any way to capture how much time both acYear & classSectionSubjectMatrix taking from start to end independently in my controller?

目前您的控制器花费 no-time 来检索这些资产,因为在您的状态已解析之前不会构建和初始化控制器。您可以使用您的响应拦截器将每次调用的运行时间传递回您的实际响应数据,但我认为这不是一个好主意。