用户界面中的嵌套承诺-路由器解析

s4n0splo  于 2022-10-24  发布在  Angular
关注(0)|答案(2)|浏览(186)

我想在视图显示之前得到一些数据,(解决)。但部分数据取决于另一个承诺的结果。我从$stateParams获得作业id(Index),并在我的服务中查找数据。一旦完成,我就从这个结果(作业)中查找设置和楼层(每个都来自不同的服务)。两人都做出了承诺。
我想出了一个办法:

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

两个都失败了。我甚至连一分钱都拿不回来。我省略了代码的其余部分,显然它们包含在以下代码中:

resolve: {
...
}

并在正确的地方进行定义。

q35jwt9p

q35jwt9p1#

我喜欢把解析器分开。
您可以通过以下方式在每个解析器上注入值:

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-路由器文档:
Resolve属性是一个Map对象。Map对象包含以下键/值对

  • key-{字符串}:要注入控制器的依赖项的名称。
  • FACTORY-{字符串|函数}:

[.]
如果是函数,则注入该函数,并将返回值视为依赖项。如果结果是承诺,则在示例化控制器并将其值注入控制器之前对其进行解析。

gcmastyq

gcmastyq2#

尝尝这个

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

相关问题