我在这种解析模态控制器中的多个参数方面遇到了麻烦,例如:
controller : 'MyController',
controllerAs : 'vm',
resolve : {
resolveInfo : function(REST){
var resolveInfo = {}
return REST.doGet('/things/').then(
function(thingsResponse){
resolveInfo.things = thingsResponse.data;
return REST.doGet('/stuff1/' + '/mystuff/' + resolveInfo.things[0].id).then(
function(stuff1Response){
resolveInfo.stuff1 = stuff1Response.data;
return REST.doGet('/stuff2/' + '/mystuff/' + resolveInfo.stuff1[0] + '/' + resolveInfo.things[0].id).then(
function(stuff2Response){
resolveInfo.stuff2 = stuff2Response.data;
return resolveInfo;
}
);
}
);
}
)
}
然后在' MyController'我从resolveInfo中取出这三个对象。
但我希望像这样的东西能起作用:
controller : 'MyController',
controllerAs : 'vm',
resolve : {
things : function(REST){
return REST.doGet('/things/').then(
function(thingsResponse){
return thingsResponse.data;
}
)
},
stuff1 : function(REST, things){
return REST.doGet('/stuff1/' + '/mystuff/' + things[0].id).then(
function(stuff1Response){
return stuff1Response.data
}
);
},
stuff2 : function(REST, stuff1, things){
return REST.doGet('/stuff2/' + '/mystuff/' + stuff1[0] + '/' + things[0].id).then(
function(stuff2Response){
return stuff2Response.data;
}
);
}
但是这会在未知的提供者面前大喊“
有没有办法实现这个目标?
答案 0 :(得分:1)
如果您想等待多个承诺,可以使用$q.all([promise1, promise2, ...])
,但是您想要使用先前承诺的结果。
基本重组可以解决您的问题:
function resolveInfo(REST) {
function getThings() {
return REST.doGet('/things/').then(
function (resp) {
return getStuff1(resp.data);
});
}
function getStuff1(things) {
return REST.doGet('/stuff1/mystuff/' + things[0].id).then(
function (resp) {
return getStuff2(things, resp.data);
});
}
function getStuff2(things, stuff1) {
return REST.doGet('/stuff2/mystuff/' + stuff1[0] + '/' + things[0].id);
}
return getThings();
}
因此,您在承诺处理程序then
中返回承诺以链接承诺。以下是有关此主题的正确文档:http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/
答案 1 :(得分:1)
使用ngRoute或ui-router时,resolve参数应立即返回其值或返回一个承诺。您的代码的问题在于您在返回值之前等待承诺结束,这将无法正确解析。
Javascript路线
这是更新承诺的更新路线代码。
controller : 'MyController',
controllerAs : 'vm',
resolve : {
things : function(REST){
return REST.doGet('/things/');
},
stuff1 : function(REST, things){
return REST.doGet('/stuff1/' + '/mystuff/' + things[0].id);
},
stuff2 : function(REST, stuff1, things){
return REST.doGet('/stuff2/' + '/mystuff/' + stuff1[0] + '/' + things[0].id);
}
}
Javascript控制器
这是一个示例控制器,然后可以使用已解析的参数。
.controller('MyController', function(things, stuff1, stuff2) {})