ui-路由器解析中的嵌套承诺
Nested promises in ui-router resolve
我已经为以下问题苦苦挣扎了一段时间:
我想在视图显示之前获取一些数据,(解决)。但是有些数据依赖于另一个promise的结果。
它是这样的:我从 $stateParams 获取作业 ID(索引)并在我的服务中查找数据。完成后,根据这个结果(工作),我可以查看设置和楼层(每个都来自不同的服务),两者都是 return 承诺。
到目前为止我想到了什么
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);
}
试试这个
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;
}
我喜欢将解析器分开。
您可以通过这种方式在每个解析器上注入值:
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;
},
The resolve property is a map object. The map object contains
key/value pairs of
- key – {string}: a name of a dependency to be injected into the controller.
- factory - {string|function}:
[...]
if function, then it is injected and the return value is treated as
the dependency. If the result is a promise, it is resolved before the
controller is instantiated and its value is injected into the
controller.
我已经为以下问题苦苦挣扎了一段时间:
我想在视图显示之前获取一些数据,(解决)。但是有些数据依赖于另一个promise的结果。
它是这样的:我从 $stateParams 获取作业 ID(索引)并在我的服务中查找数据。完成后,根据这个结果(工作),我可以查看设置和楼层(每个都来自不同的服务),两者都是 return 承诺。
到目前为止我想到了什么
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);
}
试试这个
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;
}
我喜欢将解析器分开。
您可以通过这种方式在每个解析器上注入值:
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;
},
The resolve property is a map object. The map object contains key/value pairs of
- key – {string}: a name of a dependency to be injected into the controller.
- factory - {string|function}:
[...]
if function, then it is injected and the return value is treated as the dependency. If the result is a promise, it is resolved before the controller is instantiated and its value is injected into the controller.