jQuery AJAX调用for循环

前端之家收集整理的这篇文章主要介绍了jQuery AJAX调用for循环前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > JavaScript closure inside loops – simple practical example30个
我是新来使用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);
}

即将循环的全部内容包装在一个自动执行的功能中.

这里,外部的值被传递到包装自身执行的匿名函数;这个独特的值的位置被异步回调所捕获.以这种方式,每个异步获取自己的值,在调用自执行功能的时刻确定.

猜你在找的jQuery相关文章