如何迭代函数

时间:2015-04-22 20:00:05

标签: javascript arrays angularjs for-loop

我有vs.selectedTags这是一个包含3个对象的数组。

在我的for循环中运行3次,我需要进行3次API调用,以获取每个对象的代码数据,我也可以。

当我尝试将这些代码分配给数组中的每个vs.selectedTags[i].tickers对象时,我的问题出现了。

它无法在i调用内的ApiFactory内进行迭代。 i变为3,我必须使用[i-1]来阻止它出错。但是i仍然停留在2,因此它始终将最后的代码数据保存到{strong>所有我vs.selectedTags数组中的项目。

var vs = $scope;

for (var i = 0; i < vs.selectedTags.length; i++) {

    console.log(i);

    vs.selectedTags[i].tickers = '';

    console.log(vs.selectedTags[i].tickers);

    ApiFactory.getTagData(vs.chosenTicker, vs.selectedTags[i].term_id).then(function(data) {

        // console.log(data.data.ticker_tag);
        console.log(data.data.ticker_tag.tickers);

        console.log(i-1);

        // console.log(vs.selectedTags[0]);

        // How would you properly iterate [0 - 1 - 2] here?
        vs.selectedTags[i-1].tickers = data.data.ticker_tag.tickers;

        console.log(vs.selectedTags[i-1]);
    });
}

2 个答案:

答案 0 :(得分:1)

您需要一个闭包/新范围,因为ApiFactory.getTagData函数是异步的

for (var i = 0; i < vs.selectedTags.length; i++) {
    (function(j) {

        vs.selectedTags[j].tickers = '';

        ApiFactory.getTagData(vs.chosenTicker, vs.selectedTags[j].term_id).then(function(data) {

             vs.selectedTags[j].tickers = data.data.ticker_tag.tickers;
        });
    })(i);
}

答案 1 :(得分:1)

如果你把你的for循环中的东西放在一个单独的函数中,它将修复你的闭包问题。这样:

var bob = function(i){
    console.log(i);

    vs.selectedTags[i].tickers = '';

    console.log(vs.selectedTags[i].tickers);

    ApiFactory.getTagData(vs.chosenTicker, vs.selectedTags[i].term_id).then(function(data) {

        // console.log(data.data.ticker_tag);
        console.log(data.data.ticker_tag.tickers);

        console.log(i);

        // console.log(vs.selectedTags[0]);

        // How would you properly iterate [0 - 1 - 2] here?
        vs.selectedTags[i].tickers = data.data.ticker_tag.tickers;

        console.log(vs.selectedTags[i]);
    });
}

for (var i = 0; i < vs.selectedTags.length; i++) {
    bob(i);
}