我有一系列物品。对于该数组中的每个项目,我需要进行API调用。
只有在完成对项目的所有调用之后,才会继续。
var itemProgress = [];
var promises = currentBatches.map(function(batch){
HttpWrapper.send('/api/'+batch.job_id+'/progress', { "operation": 'GET' })
.then(function(result) {
batch.succeeded_time_pct = result.succeeded_by_time_pct; // I add one property to each of the item
itemProgress.push(batch); // I push it to a new array
},function(errorResponse) {
console.log(errorResponse);
});
});
此处我尝试在new property
之后为每个项目添加an API call for each of the items
。
当所有电话都完成后,
我想分配this new array to the current array
。
$q.all(promises).then(function(result){
currentBatches = itemProgress;
});
我做错了什么?
为什么currentBatches = migrationProgress; inside $q.all
正在评估之前为每个项目执行最顶层的块。我该如何解决?
答案 0 :(得分:4)
您应该在return
回调中添加map()
。
var itemProgress = [];
var promises = currentBatches.map(function(batch){
// return the following promise
return HttpWrapper.send('/api/'+batch.job_id+'/progress', { "operation": 'GET' })
.then(function(result) {
batch.succeeded_time_pct = result.succeeded_by_time_pct; // I add one property to each of the item
itemProgress.push(batch); // I push it to a new array
},function(errorResponse) {
console.log(errorResponse);
});
});
$q.all(promises).then(function(result){
currentBatches = itemProgress;
});
这将返回由HttpWrapper.send()
生成的promise并将其作为promises数组的项目。看一下map() docs:回调应该是一个产生新数组元素的函数。如果没有return语句,元素将为undefined
。因此,$ q.all调用立即得到解决。