我有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]);
});
}
答案 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);
}