将响应映射到相应的请求

时间:2016-01-12 09:32:18

标签: angularjs angularjs-scope angularjs-q

我收到所有回复后,我正在向多个环境发出$http请求并进行处理。我使用下面的代码:

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

}, function(err){
  console.error(err);
});

function request(env) {
  return $http.get(callService.getDomainUrl()+'/'+$rootScope.envs[env]+ '/hosts.json');
}

上面的代码工作正常,但结果对象如下所示:

{
  0: {data:{}}, 
  1: {data:{}}, 
  2: {data:{}}, 
  3: {data:{}}
}

我希望每个键都有相应的响应,结果应该像

{
  env1: {data:{//data for env1}}, 
  env2: {data:{//data for env2}}, 
  env3: {data:{//data for env3}}, 
  env4: {data:{//data for env4}}, 
}

如何映射对应的响应?请告诉我如何获取此信息,因为这是异步请求。我是否应该从API获得一些信息来了解API的来源?

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是将结果处理推送到请求函数中,这样你在范围内仍然有'env'值。

var results = {};

$q.all(Object.keys($rootScope.envs).map(request)).then(function(res){
   // Do something with 'results' here.
}, function(err){
  console.error(err);
});

function request(env) {
  return $http.get(callService.getDomainUrl()+'/'+$rootScope.envs[env]+ '/hosts.json')
  .then(function(res) { results[env] = res.data; return env; });
}

另一种选择是将return env替换为return [env, res.data],然后您可以像原始代码一样返回创建结果对象。

重要的是要记住,您可以单独处理$http.get承诺,也可以使用then$q.all来电的承诺。