在Angularjs中使用$q整理公共函数内的所有http响应

在Angularjs中使用$q整理公共函数内的所有http响应,angularjs,angular-promise,angularjs-q,Angularjs,Angular Promise,Angularjs Q,我正在尝试在控制器内使用$q服务。我有多个环境,我需要点击并收集数据,整合数据,然后放入范围内。我有下面的代码 var results=[]; for(var environment in $rootScope.envs){ $http.get(callService.getDomainUrl()+'/'+$rootScope.envs[environment]+ '/hosts.json').success(function(data){

我正在尝试在控制器内使用
$q
服务。我有多个环境,我需要点击并收集数据,整合数据,然后放入范围内。我有下面的代码

     var results=[];
     for(var environment in  $rootScope.envs){
       $http.get(callService.getDomainUrl()+'/'+$rootScope.envs[environment]+ '/hosts.json').success(function(data){
              results.push(data)
          })
      }

      $q.all(results).then(function(){
          console.log(results);
      })
但是,我不确定这是否是正确的方法,我还需要将结果映射到以下类型的对象:

results:{
  env1: { // result data for env1},
  env2: { // result data for env2},
  env3: { // result data for env3},
}

如何解决承诺问题并以上述格式整合数据。

您应该检查这一点(查看日志)。我通过
setTimeout
函数模拟$http.get请求。

作为@SlavaUtesinov answer的补充。
您不应该使用
$q.defer
创建新承诺,只需使用
$http.get
return即可

你会得到这样的结果:

  $q.all(Object.keys($rootScope.envs).map(request)).then(function(res){
    var results = {};
    for (var env in res) {
      results[env] = res[env].data;
    }
    console.log(results);
  }, function(err){
    console.error(err);
  });

  function request(env) {
    return $http.get(callService.getDomainUrl()+'/'+$rootScope.envs[env]+ '/hosts.json');
  }
无论如何,
$q.all
将承诺的数组/哈希组合成一个承诺。

所以,你应该在打电话之前收集承诺。

这就是我要找的。如果存在错误,处理任何环境的错误条件的最佳方法是什么?此外,结果对象现在包含数据,而不是映射到环境名称的键。我希望输出在{env1:{data1},env2:{data2},env3:{data3},env4:{data4}中。我更正我的答案-移位
var prom=$q.defer();承诺。推动(prom)。你能写下你在控制台上得到的东西吗:
console.log(results)我添加了错误处理代码,请看新代码!这是一个反模式。您可以使用
$http.get
promise而不创建新的。上面的代码工作得非常好。但是,results对象包含来自四个环境的所有响应。我需要将每个环境的响应映射到它的名称。如果您将带有承诺的哈希对象传递给
$q,那么如何以response={[{env1:{env2 res object}}、{env2:{env2 res object}、{env3:{env3 res object}}}的格式完成这项工作。所有的
原始密钥都将保存在结果中。您应该传递
{env1':request('env1')、env2 request('env2')}
哈希来实现这一点。