【问题标题】:How to call function after API gets are finished inside of for loop?在for循环内完成API获取后如何调用函数?
【发布时间】:2015-09-12 17:39:43
【问题描述】:

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

在调用TagFactory.buildSavedView(obj) 行之前,我需要一些方法来判断所有3 个GETS 以及for loop 何时完成。想法?

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;

【问题讨论】:

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


【解决方案1】:

您需要使用$q.all,但创建一个promise 数组并将其传递给$q.all,该数组将仅在所有promise 都执行时执行其.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.
})

【讨论】:

  • @LeonGaban 实际上是 2 分钟。我很晚才看到这个问题 :D 谢谢 :)
【解决方案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;
    }

  });
}

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 2012-07-01
    • 1970-01-01
    • 2014-05-12
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多