在 Angularjs 中使用 $q 整理公共函数内的所有 http 响应
Collating all the http response inside a common function using $q in Angularjs
我正在尝试在我的控制器中使用 $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},
}
如何解析promise,合并上述格式的数据。
您应该检查这个 example(查看日志)。我通过 setTimeout
函数模拟 $http.get 请求。
作为@SlavaUtesinov 回答的补充。
您不应该使用 $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
将 array/hash 个承诺合并为一个承诺。
所以,你应该在调用它之前收集承诺。
我正在尝试在我的控制器中使用 $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},
}
如何解析promise,合并上述格式的数据。
您应该检查这个 example(查看日志)。我通过 setTimeout
函数模拟 $http.get 请求。
作为@SlavaUtesinov 回答的补充。
您不应该使用 $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
将 array/hash 个承诺合并为一个承诺。
所以,你应该在调用它之前收集承诺。