使用jQuery将AJAX调用与原始URL重新关联

时间:2010-11-20 02:22:58

标签: jquery xmlhttprequest

我不确定如何解释这一点,这使搜索非常困难(特别是因为我确实这是一个错误的思考)。

我有一个对象数组:

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”未定义。我找不到将它传递给函数的方法,这让我觉得我在这里只是从根本上误解了一个核心概念。

任何帮助都会非常感激。我很高兴自己读,如果有人能让我知道我应该寻找什么。正如你在我的标题中所看到的那样,我甚至很难描述我正在尝试做什么。

1 个答案:

答案 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.
}