如何在API获取后调用函数在for循环内完成?

时间:2015-06-25 22:20:10

标签: javascript angularjs for-loop promise angular-promise

下面是一个for循环,它将运行最多的时间,在for循环内部我进行GET调用以返回一些需要添加到我的obj对象的数据。

在调用GETS行之前,我需要一些方法来判断所有3 for loopTagFactory.buildSavedView(obj)的完成情况。想法?

for (var i = 0; i < termIDs.length; i++) {
    ApiFactory.getTagData(tickers[i], termIDs[i]).then(function(data) {
        singleTagArray.push(data.data.tickers);

        var updatedTag   = TagFactory.renderDirections(singleTagArray, null, period);
            newTagObject = updatedTag[0];

        tags.push(newTagObject);

        finishObjSetup(tags);
        console.log('viewHeaderDirect > obj: ', obj);
    });
}

TagFactory.buildSavedView(obj);
vm.loadSavedModal = false;

2 个答案:

答案 0 :(得分:4)

你需要使用$q.all,但是创建一个promise数组并将其传递给$q.all,只有当所有的promises都被执行时才会执行.then

<强>代码

var promises = [];
for (var i = 0; i < termIDs.length; i++) {
    var promise = ApiFactory.getTagData(tickers[i], termIDs[i]).then(function(data) {
        singleTagArray.push(data.data.tickers);

        var updatedTag   = TagFactory.renderDirections(singleTagArray, null, period);
            newTagObject = updatedTag[0];

        tags.push(newTagObject);

        finishObjSetup(tags);
        console.log('viewHeaderDirect > obj: ', obj);
    });
    promise.push(promise); //creating promise array.
}

$q.all(promise).then(function(){
    //here the call will goes after all calls completed.
})

答案 1 :(得分:2)

你可以使用一个简单的计数器:

var y = 0;

for (var i = 0; i < termIDs.length; i++) {
  ApiFactory.getTagData(tickers[i], termIDs[i]).then(function (data) {
    y++;
    singleTagArray.push(data.data.tickers);

    var updatedTag = TagFactory.renderDirections(singleTagArray, null, period);
    newTagObject = updatedTag[0];

    tags.push(newTagObject);

    finishObjSetup(tags);
    console.log('viewHeaderDirect > obj: ', obj);

    if (y === termIDs.length) {
      TagFactory.buildSavedView(obj);
      vm.loadSavedModal = false;
    }

  });
}