从下面的代码示例中,我试图在循环遍历text_array的每个用户时从文本中获取位置。从文本中提取位置后,我试图将值返回到与正确用户对应的数组,但它给出了错误“text_array [i]未定义”。这件事我做错了什么?
function replace_undefined(text_array) {
var userLocationText = {};
for (i = 0, l = text_array.length; i < l; i++) {
console.log(text_array[i].user);
userLocationText[text_array[i].user] = text_array[i].location;
var text = text_array[i].text;
Placemaker.getPlaces(text, function (o) {
console.log(o);
if ($.isArray(o.match)) {
if (o.match[0].place.name == "Europe" || o.match[0].place.name == "United States") {
var location = o.match[1].place.name;
userLocationText[text_array[i].user] = location;
}
if ($.isArray(o.match)) {
if (o.match[0].place.name !== "Europe") {
var location = o.match[0].place.name;
userLocationText[text_array[i].user] = location;
}
}
} else if (!$.isArray(o.match)) {
var location = o.match.place.name;
userLocationText[text_array[i].user] = location;
}
console.log(text_array);
});
}
}
}
text_array = [{
user: a,
user_id: b,
date: c,
profile_img: d,
text: e,
contentString: f,
url: g,
location: undefined
}, {
user: a,
user_id: b,
date: c,
profile_img: d,
text: e,
contentString: f,
url: g,
location: undefined
}, {
user: a,
user_id: b,
date: c,
profile_img: d,
text: e,
contentString: f,
url: g,
location: undefined
}];
答案 0 :(得分:0)
因为Placemaker.getPlaces
肯定是异步的,所以这里是一个脏的闭包:
Placemaker.getPlaces(text, (function () {
var z = i;
return function (o) {
var i = z;
...
console.log(text_array);
};
})());
如果使用另一个var而不是“i”,它会更清晰,在它自己的回调中提取函数等。
基本上,不是发送一个函数来执行Placemaker.getPlaces的第二个参数,而是将它包装在另一个立即执行的函数中。即时执行包装函数保存当前值“i”,并返回初始匿名函数。 Placemaker.getPlaces在准备就绪时将使用初始函数,如前所述。
但是现在,由于闭包,我的“z”var保存了for循环中存在的“i”的值,并且可以在循环结束后很长时间内使用。
我知道,不是那么清楚。
编辑:好吧,也许this fiddle会有所帮助。