Restangular ui.router解析异步或同步

时间:2016-01-07 17:08:28

标签: angularjs restangular

我正在使用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();
                    }

                }

我有两个决心返回acYear& classSectionSubjectMatrix。我的问题是acYear和& classSectionSubjectMatrix同时触发(并行)或按顺序触发(先acYear然后classSectionSubjectMatrix)?

其次,有没有办法捕捉acYear和& classSectionSubjectMatrix在我的控制器中从头到尾独立完成?

像这样的东西。

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;
                    });

2 个答案:

答案 0 :(得分:2)

首先,你没有解决任何有关州决议的问题......

如果你想通过承诺我相信使用服务会好得多。因此,我假设您要解决状态解析的承诺并将已解析的对象返回给控制器。

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

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进行第二次请求......

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

答案 1 :(得分:1)

回答第一个问题:

  

我的问题是,acYear& classSectionSubjectMatrix同时触发(并行)或者它将以顺序方式触发(首先是acYear然后是classSectionSubjectMatrix)?

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

回答第二个问题:

  

第二,有没有什么方法可以捕捉到acYear& classSectionSubjectMatrix在我的控制器中独立地从开始到结束?

目前,您的控制器花费了很多时间来检索这些资产,因为在您的州已解决之前,控制器尚未构建和初始化。您可以使用响应拦截器将每次调用的已用时间传递回实际响应数据,但我认为这不是一个好主意。