我不确定如何解释这一点,这使搜索非常困难(特别是因为我确实这是一个错误的思考)。
我有一个对象数组:
var a = [
{
url: "http://www.discusionboard.com/list-of-boards/",
name: "Discussion Board One",
threads: []
},
{url: "...", name: "...", threads: [] }
]
我循环遍历这些对象,下载每个页面,然后尝试将线程添加回原始对象。
for( var i = 0; i < a.length; i++ ) {
jQuery.get(a[i].url, function(result, status, xhr) {
/* result is list of threads separated by "[SPLIT]" */
a[i].threads = result.split("[SPLIT]")
});
}
我的问题是,[i] .threads中的“i”未定义。我找不到将它传递给函数的方法,这让我觉得我在这里只是从根本上误解了一个核心概念。
任何帮助都会非常感激。我很高兴自己读,如果有人能让我知道我应该寻找什么。正如你在我的标题中所看到的那样,我甚至很难描述我正在尝试做什么。
答案 0 :(得分:1)
这是闭环问题的一个很好的例子。传递给jQuery的回调函数仅在循环完成后执行(即使在函数内部返回一个值之后)。因此,a[i]
(对回调函数)将始终是数组的最后一个元素。 jQuery.ajax
提供context
设置来解决此问题:
for( var i = 0; i < a.length; i++ ) {
jQuery.ajax({
url: a[i].url,
context: a[i],
success: function(result, status, xhr) {
/* result is list of threads separated by "[SPLIT]" */
this.threads = result.split("[SPLIT]")
}
});
}
请注意,如果您之后需要使用已完成对象的代码,那也是一个问题。要解决这个问题,你需要把它放在回调函数之外:
var numRequests = a.length;
这在回调函数的末尾:
if(!--numRequests) {
// Do whatever now that all object data has been loaded.
}