参见英文答案 >
JavaScript closure inside loops – simple practical example30个
我是新来使用AJAX,而我正在编写一个用户脚本,它会处理一个页面上的一些链接,并为每个链接发出AJAX调用.
我是新来使用AJAX,而我正在编写一个用户脚本,它会处理一个页面上的一些链接,并为每个链接发出AJAX调用.
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终于触发时,它知道它的[i]值,当AJAX首次触发时,而不是[i]当.
如何确保.done知道当AJAX第一次调用时它的价值?
解决方法
最简单的方法是使用闭包.每当你在一个循环中有异步的时候,这是一回事.
for (var i .....) { async(function() { use(i); } }
在这个伪代码片段中,内部函数捕获由i引用的存储位置.循环运行,我增加到其最终值,然后异步回调开始被调用,所有这些都查找完全相同的位置(不是值).
一般解决方案是:
for (var i .....) { (function (i) { async(function() { use(i); }); })(i); }
这里,外部的值被传递到包装自身执行的匿名函数;这个独特的值的位置被异步回调所捕获.以这种方式,每个异步获取自己的值,在调用自执行功能的时刻确定.