ui-router中的嵌套承诺解析

时间:2015-06-17 14:52:25

标签: angularjs nested angular-ui-router promise resolve

我一直在努力解决以下问题:

我想在视图显示之前得到一些数据,(解析)。但是有些数据取决于另一个承诺的结果。

它是这样的:我从$ stateParams获取作业ID(索引)并在我的服务中查找数据。一旦完成,从这个结果(作业),我可以查找设置和楼层(每个来自不同的服务),都返回一个承诺。

到目前为止我已经提出了什么

jobinfo: function(Jobs, Floor, JobSetting, $stateParams, $q) {

    var defer = $q.defer();

        Jobs.getByIndex($stateParams.index)
        .then(function(job) {
            console.log('got jobs');
            $q.all({floors: Floor.getByJob(job), settings: JobSetting.getByJob(job)})
            .then(function(info) {
                console.log('got info');
                defer.resolve([job, info.floors, info.settings]);
            });
        });

    return defer.promise;
}

拿2

jobinfo: function(Jobs, Floor, JobSetting, $stateParams, $q) {

    return Jobs.getByIndex($stateParams.index)
        .then(function(job) {
            console.log('got jobs');
            return $q.all({floors: Floor.getByJob(job), settings: JobSetting.getByJob(job)})
            .then(function(info) {
                console.log('got info');
                return [job, info.floors, info.settings];
            });
        });
}

两者似乎都失败了,我甚至没有得到console.log回来。

PS:我把剩下的代码遗漏了,显然它们被包裹在

resolve: {
...
}

并在正确的位置定义。

有人可以如此温和地指出我朝着正确的方向前进吗?

我最终得到的解决方案如下:(感谢 avcajaraville

job: function(Jobs, $stateParams) {
    return Jobs.getByIndex($stateParams.index);
},

floors: function(Floor, job) {
    return Floor.getByJob(job);
},

settings: function(JobSetting, job) {
    return JobSetting.getByJob(job);
}

2 个答案:

答案 0 :(得分:5)

我喜欢将解析器分开。

您可以通过以下方式为每个解析器注入值:

job : function( Jobs, $stateParams, $q ) {
    var defer = $q.defer();
    Jobs.getByIndex( $stateParams.index, function( job ) {
        defer.resolve( job );
    });
    return defer.promise;
},

floor : function( Floor, job, $q ) {
    var defer = $q.defer();
    Floor.getByJob( job, function( floor ) {
        defer.resolve( floor );
    });
    return defer.promise;
},

settings : function( JobSetting, job, $q ) {
    var defer = $q.defer();
    JobSetting.getByJob( job, function( settings ) {
        defer.resolve( settings );
    });
    return defer.promise;
},

来自ui-router documentation

  

resolve属性是一个地图对象。地图对象包含   

的键/值对      
      
  • key - {string}:要注入控制器的依赖项的名称。
  •   
  • factory - {string | function}:
  •   
     

[...]

     

如果是函数,则将其注入并将返回值视为   依赖。如果结果是一个承诺,它将在之前得到解决   控制器被实例化,其值被​​注入   控制器。

答案 1 :(得分:0)

试试这个

jobinfo: function(Jobs, Floor, JobSetting, $stateParams, $q) {

              var defer = $q.defer();

              Jobs.getByIndex($stateParams.index)
                  .then(function(job) {
                      console.log('got jobs');
                      var floors = Floor.getByJob(job);
                      var settings = JobSetting.getByJob(job);
                      $q.all([floors, settings])
                      .then(function(info) {
                          console.log('got info');
                          defer.resolve([job, info[0], info[1]]);
                      });
                  });

              return defer.promise;
          }