将值返回给数组中的相应用户

时间:2012-08-22 16:41:23

标签: javascript

从下面的代码示例中,我试图在循环遍历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
}];

1 个答案:

答案 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会有所帮助。