Angular Promises使用$ q.all

时间:2017-06-20 16:51:56

标签: javascript angularjs arrays promise

我有一系列物品。对于该数组中的每个项目,我需要进行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正在评估之前为每个项目执行最顶层的块。我该如何解决?

1 个答案:

答案 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调用立即得到解决。