jQuery AJAX调用for循环

我是使用AJAX的新手,并且正在编写一个脚本,它将处理页面上的一堆链接,并为每个链接创buildAJAX调用。

for (var i = 0; i < linkList.length; i++) { $.ajax({ url: linkList[i].getAttribute("href"), cache: false }).done(function( html ) { var hasAppended = false; if (html.indexOf('someStringOnGottenPage') != -1 && !hasAppended) { hasAppended = true; var id = linkList[i].getAttribute("href").substring(linkList[i].getAttribute("href").indexOf('=')); $( "#links a[href*='" + id + "']" ).append(' THIS PAGE CONTAINS SPECIFIED DATA'); } }); } 

试图简单地说,我有一个链接列表的页面。 我希望遍历链接并获取AJAX来处理每个链接页面的内容,并在该页面包含指定的内容时返回。

我遇到的问题是[i]用于迭代linkList的值始终是6,并且它永远不会。 我假设我需要传递一些数据,以便当.done最终触发时,它知道AJAX第一次触发时的[i]值,而稍后.done会触发[i]的值。

我该如何去确保。当AJAX第一次被调用的时候,我知道它是值得的。

最简单的方法是使用闭包。 只要你在循环中有asynchronous的东西,它是一样的。

 for (var i .....) { async(function() { use(i); } } 

在这个伪代码片段中,内部函数捕获由i引用的存储位置 。 循环运行, i增加到它的最终值,然后asynchronouscallback开始得到调用,所有他们查找完全相同的位置 (不值)。

一般的解决scheme是这样的:

 for (var i .....) { (function (i) { async(function() { use(i); }); })(i); } 

即把你的循环的全部内容包装在一个自动执行的函数中。

在这里,外部i被传递到包装自我执行的匿名函数; 这个唯一值的位置被asynchronouscallback捕获。 通过这种方式,每个asynchronous获得自己的值,在执行自执行函数的时刻被确定。

问题注释部分的链接告诉你代码中出了什么问题,但是你可以有一个比以前解释的更好的解决scheme。

尝试$ .each()遍历列表(假设它是一个数组),所以通过的callback将为每个迭代创build一个单独的闭包

 $.each(linkList, function (i, item) { $.ajax({ url: item.getAttribute("href"), cache: false }).done(function (html) { var hasAppended = false; if (html.indexOf('someStringOnGottenPage') != -1 && !hasAppended) { hasAppended = true; var id = item.getAttribute("href").substring(item.getAttribute("href").indexOf('=')); $("#links a[href*='" + id + "']").append(' THIS PAGE CONTAINS SPECIFIED DATA'); } }); }) 

如果它是一个jQuery对象,那么使用.each()

 linkList.each(function (i, item) { var $item = $(item), href = $item.attr("href"); $.ajax({ url: href, cache: false }).done(function (html) { var hasAppended = false; if (html.indexOf('someStringOnGottenPage') != -1 && !hasAppended) { hasAppended = true; var id = href.substring(href.indexOf('=')); $("#links a[href*='" + id + "']").append(' THIS PAGE CONTAINS SPECIFIED DATA'); } }); })