Javascript AngularJs控制器解析依赖项

Javascript AngularJs控制器解析依赖项,javascript,angularjs,Javascript,Angularjs,我在解决模态控制器中的多个参数时遇到问题,例如: controller:'MyController', controllerAs:'vm', 决心:{ resolveInfo:函数(REST){ var resolveInfo={} 返回REST.doGet('/things/')。然后( 功能(thingsResponse){ resolveInfo.things=thingsResponse.data; 返回REST.doGet('/stuff1/'+'/mystuff/'+resolveI

我在解决模态控制器中的多个参数时遇到问题,例如:

controller:'MyController',
controllerAs:'vm',
决心:{
resolveInfo:函数(REST){
var resolveInfo={}
返回REST.doGet('/things/')。然后(
功能(thingsResponse){
resolveInfo.things=thingsResponse.data;
返回REST.doGet('/stuff1/'+'/mystuff/'+resolveInfo.things[0].id)。然后(
功能(填充1响应){
resolveInfo.stuff1=stuff1Response.data;
返回REST.doGet('/stuff2/'+'/mystuff/'+resolveInfo.stuff1[0]+'/'+resolveInfo.things[0].id)。然后(
功能(stuff2Response){
resolveInfo.stuff2=stuff2Response.data;
返回解析信息;
}
);
}
);    
}
)
}
然后在“MyController”中,我从resolveInfo中取出这三个对象。 但我希望这样的事情会奏效:

controller:'MyController',
controllerAs:'vm',
决心:{
事物:功能(休息){
返回REST.doGet('/things/')。然后(
功能(thingsResponse){
返回thingsResponse.data;
}
)
},
材料1:功能(休息、事物){
返回REST.doGet('/stuff1/'+'/mystuff/'+things[0].id)。然后(
功能(填充1响应){
返回stuff1Response.data
}
);
},
Stuff 2:功能(休息、Stuff 1、事物){
返回REST.doGet('/stuff2/'+'/mystuff/'+stuff1[0]+'/'+things[0].id)(
功能(stuff2Response){
返回stuff2Response.data;
}
);
}
但这对“东西”大喊大叫


有没有办法做到这一点?

当你想等待多个承诺时,你可以使用
$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();
}

因此,您在承诺处理程序
中返回承诺,然后
链接承诺。以下是有关此主题的适当文档:

当使用ngRoute或ui router时,参数应立即返回其值或返回承诺。代码的问题是,在返回承诺之前,您正在等待承诺结束值,该值将无法正确解析

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

您需要使用$q.all()…它将等待所有资源后才能继续。这是我正在寻找的,我不知道已解析的数据或承诺。因此我需要将
东西[0]。id
更改为
东西。数据[0]。id
或在
东西:函数(REST)中使用
$q
返回带有已处理数据的新承诺。