Angular 服务每个 $q.promise
Angular service foreach $q.promise
我有以下功能:
this.getBenchmarkData = function () {
var benchmarkData = [];
var d = $q.defer();
users.forEach(function(user){
var dataArray = [];
modules.forEach(function (module) {
$http.get(api.getUrl('teamUserBenchmark', [user.user_id, module.id, user.team_id]))
.success(function (response) {
response.forEach(function(result){
dataArray.push(result.score);
})
});
});
benchmarkData.push(dataArray);
});
d.resolve(benchmarkData);
return d.promise
}
问题是 d.resolve(benchmarkData)
在实际数据输入之前运行。
我知道这是异步 $http
任务的问题。但是我不确定如何修复它。谁能指出我正确的方向?
您没有正确解决承诺,您应该收集数组中的所有承诺,然后使用 $q.all
解决延迟的承诺
代码
this.getBenchmarkData = function () {
var benchmarkData = [];
var d = $q.defer(), promise = [];
users.forEach(function(user){
var dataArray = [];
modules.forEach(function (module) {
var currentPromise = $http.get(api.getUrl('teamUserBenchmark', [user.user_id, module.id, user.team_id]))
.success(function (response) {
response.forEach(function(result){
dataArray.push(result.score);
})
});
promise.push(currentPromise); //<--creating promise array here
});
});
$q.all(promise).then(function(){
benchmarkData.push(dataArray); //added whole data.
d.resolve(benchmarkData); //resolved after all promise gets completed
});
return d.promise
我有以下功能:
this.getBenchmarkData = function () {
var benchmarkData = [];
var d = $q.defer();
users.forEach(function(user){
var dataArray = [];
modules.forEach(function (module) {
$http.get(api.getUrl('teamUserBenchmark', [user.user_id, module.id, user.team_id]))
.success(function (response) {
response.forEach(function(result){
dataArray.push(result.score);
})
});
});
benchmarkData.push(dataArray);
});
d.resolve(benchmarkData);
return d.promise
}
问题是 d.resolve(benchmarkData)
在实际数据输入之前运行。
我知道这是异步 $http
任务的问题。但是我不确定如何修复它。谁能指出我正确的方向?
您没有正确解决承诺,您应该收集数组中的所有承诺,然后使用 $q.all
解决延迟的承诺
代码
this.getBenchmarkData = function () {
var benchmarkData = [];
var d = $q.defer(), promise = [];
users.forEach(function(user){
var dataArray = [];
modules.forEach(function (module) {
var currentPromise = $http.get(api.getUrl('teamUserBenchmark', [user.user_id, module.id, user.team_id]))
.success(function (response) {
response.forEach(function(result){
dataArray.push(result.score);
})
});
promise.push(currentPromise); //<--creating promise array here
});
});
$q.all(promise).then(function(){
benchmarkData.push(dataArray); //added whole data.
d.resolve(benchmarkData); //resolved after all promise gets completed
});
return d.promise