Leon Gaban
Leon Gaban

Reputation: 39018

How to call function after API gets are finished inside of for loop?

Below is a for loop which will run a max of time times, Inside of that for loop I make a GET call to return some data that needs to be added to my obj object.

I need some way to tell when all 3 GETS are finished as well as the for loop before calling the TagFactory.buildSavedView(obj) line. Thoughts?

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;

Upvotes: 2

Views: 1968

Answers (2)

Pankaj Parkar
Pankaj Parkar

Reputation: 136144

You need to use $q.all, but creating a promise array and pass it to $q.all that will execute its .then only when all the promises gets executed.

Code

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.
})

Upvotes: 4

Thomas Eschemann
Thomas Eschemann

Reputation: 995

You could use a simple counter:

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;
    }

  });
}

Upvotes: 2

Related Questions