当前位置: 首页 > 面试题库 >

jQuery AJAX调用for循环

卫昊东
2023-03-14
问题内容

我是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" target="_blank">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来处理每个链接页面的内容,并报告该页面是否包含指定内容。

我遇到的问题是用于遍历linkList的[i]的值始终为6,应该永远不会。我假设我需要传递一些数据,以便当.done最终触发时,它从AJAX首次触发时知道其[i]值,而在.done之后触发时则不知道[i]的值。

在首次调用AJAX时,如何确保.done知道[i]值?


问题答案:

最简单的方法是使用闭包。每当循环中有异步的东西时,它都是同一件事。

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

在此伪代码段中,内部函数捕获引用的_存储位置_i。循环运行,i递增到其最终值,然后开始调用异步回调,所有这些回调都查找完全相同的 位置(而不是值)。

通用解决方案是这样的:

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

将循环的全部内容包装在一个自执行函数中。

在这里,outer 的_值_i被传递给包装的自执行匿名函数;这个唯一值的位置被异步回调捕获。这样,每个异步都会获得自己的值,该值是在调用自执行函数时确定的。



 类似资料:
  • 问题内容: 我创建了一个for循环,该循环循环了元素出现在容器中的次数。for循环从HTML捕获一些数据,并创建一个JSON url,然后将返回一个值。然后应将该值添加到适当位置的HTML中。 问题似乎是for循环在进行所有Ajax调用之前完成,因此仅将最后一个值添加到HTML。我以为可以确保readystate等于4,但是该解决方案不起作用。我还尝试将完整而不是成功用作Ajax事件。有什么见解吗

  • 问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包:

  • 似乎“for in”循环隐式调用函数迭代器,参数状态为:i(s) 任何人都能告诉我,发生了什么?

  • 我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码:

  • for循环是一种重复控制结构,允许您有效地编写需要执行特定次数的循环。 语法 (Syntax) Perl编程语言中for循环的语法是 - for ( init; condition; increment ) { statement(s); } 这是for循环中的控制流 - init步骤首先执行,只执行一次。 此步骤允许您声明和初始化任何循环控制变量。 只要出现分号,就不需要在此处输入声明。

  • ' for '循环是最紧凑的循环形式。 它包括以下三个重要部分 - loop initialization ,我们将计数器初始化为起始值。 初始化语句在循环开始之前执行。 test statement将测试给定条件是否为真。 如果条件为真,则执行循环内给出的代码,否则控件将退出循环。 iteration statement ,您可以在其中增加或减少计数器。 您可以将所有三个部分放在一行中以分号分隔