AngularJS:使用回调在循环中获取数据

时间:2015-08-21 10:22:50

标签: javascript angularjs

我尝试在循环中获取多个json文件。数据被获取,但在我的回调函数中,我留下了每个结果的循环的最后一个键。

以下是来电者:

deckbuilderApp.factory('DeckFactory', ['$http', '$rootScope', 'DataFactory', function($http, $rootScope, DataFactory) {

  var cardColors = {"white":{}, "blue":{}, "black":{}, "red":{}, "green":{}, "colorless":{}};
  var cardColorsCheck = {"white":true, "blue":true, "black":true, "red":true, "green":true, "colorless":true};

  return {
    fetchCardColors: function() {
      for (key in cardColors) {
        if (cardColors.hasOwnProperty(key)) {
          DataFactory.cardColors(key, function(cardIds) {
            console.log("GOT COLORS FOR " + key);
            cardColors[key] = cardIds;
          });
        }
      }
    }
  }
}

被叫者:

deckbuilderApp.factory('DataFactory', function($http) {
  return {
    cardColors: function(color, callback) {
      $http({
        method: 'GET',
        url: 'js/cardColors/' + color + '.json'
      }).success(callback)
    }
  }
}

获取的数据是合法的,但是日志行始终打印" GOT COLORS FOR无色"最后一把钥匙。

1 个答案:

答案 0 :(得分:2)

这与评估

相同
for (var i = 0; i < 100; i++) {
    setTimeout(function () {
        console.log(i);
    }, 0)
}

您将获得100次登录控制台的100次。

这是因为for循环的内容是异步的。

为了防止这种情况,你可以使用let(关闭,生命等):

for (var i = 0; i < 100; i++) {
    (function (i) {
        setTimeout(function () {
            console.log(i);
        }, 0)
    })(i)
}

此模式非常常见,在新的JavaScript(ES6)中有一个let关键字:

for (let i = 0; i < 100; i++) {
    setTimeout(function () {
        console.log(i);
    }, 0)
}