【问题标题】:jQuery AJAX Requests in loop Array issue循环数组问题中的 jQuery AJAX 请求
【发布时间】:2014-03-08 07:37:09
【问题描述】:

我在 for 循环中有一些 AJAX 请求。循环遍历 URL 数组并向所有 URL 发送请求,检查每个页面上的某些内容,然后包含正确数据的页面将一些数据写入数组。该数组是一个“全局”变量。

循环工作正常。请求工作正常。阵列无法正常工作。请求 1 的 done() 函数将推送到数组,但下一个 done() 将只是覆盖。这种情况总是发生在 done() 快速连续调用将覆盖数组的部分而不是添加到它的地方。我不知道为什么会这样。

我了解 AJAX 调用以奇怪的顺序和时间返回,但我认为我使用 array.push() 可以解决指定索引的需要。怎么回事?

var globalArray = [];

for (var i = 0; i < URLList.length; i++)
    {
        (function (i) {
            $.ajax(
            {
                url: URLList[i],
                cache: false
            }).done(function(html)
            {
                if (html.indexOf('someString') != -1)
                {
                    globalArray.push(URLList[i]);
                }
            });
        })(i);
    }

所以基本上,即使第二个 done() 在第一个 done() 之后触发,第二个 done() 的 array.push() 也会假装数组是空的。我不知道为什么每次都不检查。

【问题讨论】:

  • if (html.indexOf('someString') !=) 可能缺少 -1 ==>> if (html.indexOf('someString') != -1)。此外,我不明白为什么需要函数 (i) - 只需将代码放在 for 循环中并直接引用 I。该函数没有添加任何内容。
  • 我的错。 -1 已经在我的代码中。我只是在传输过程中意外删除了它。它在一个函数中,因为没有它它就无法工作。我不记得确切的原因。唉,问题出在数组上,而不是循环上。
  • globalarray 定义是否正确? var globalArray = []; ??
  • URLList[i] 真的有 href 属性吗?它看起来像是来自 ajax 调用的字符串数组?
  • 再一次,我的错误。我的代码略有不同 - 我在这里简化了版本。不会有什么不同。

标签: javascript jquery ajax arrays loops


【解决方案1】:

改进@Varrinder 的回答

var URLList = ["url1", "url2", "url3"];
var ajaxResulstArray = [];

makeRequest();

function makeRequest() {

    var urlToRequest = URLList.shift();

    if (urlToRequest != undefined) {
        $.ajax({ 
            url: urlToRequest, cache:false 
        }).done(function(html) {
            if (html.indexOf("someString") != -1) {
                ajaxResulstArray.push(urlToRequest);
            }
        }).always(makeRequest);
    }
}

【讨论】:

    【解决方案2】:

    希望我没有完全错过这里的重点。

    我会试试Array.shift()

    如下所示:

    var URLList = ["url1", "url2", "url3"];
    var ajaxResulstArray = [];
    
    makeRequest();
    
    function makeRequest() {
    
        var urlToRequest = URLList.shift();
    
        if (urlToRequest != undefined) {
            $.ajax({ 
                url: urlToRequest, cache:false 
            }).done(function(html) {
                if (html.indexOf("someString") != -1) {
                    ajaxResulstArray.push(urlToRequest);
                }
                makeRequest();
            });
        }
    }
    

    【讨论】:

    • 正在查询所有正确的页面,并且使用 console.log 我可以看到每个“成功”的页面,但并非所有“成功”的查询在应该写入我的全局数组时,因为 push() 不断覆盖自己。这就是问题所在。
    • 也许然后改变这个:globalArray.push(URLList[i]);到这个 globalArray[i] = URLList[i];那么你有你的唯一索引 i 所以没有覆盖可能。
    • 我做不到。不是每一个 i 都会是一个成功的页面,所以数组的索引之间可能会有很大的差距
    • 是的,但只需尝试一下,然后我们就可以看到它是否朝着正确的方向迈出了一步。我认为 push 不太可能会覆盖,所以让我们先证明这一点。
    • 是的,这行得通。现在所有值都放入数组中。即使我随后声明了一个全局整数,我也会遇到每次调用都会误解它的同一堵墙。
    【解决方案3】:

    我已经声明了一个全局整数。

    到目前为止,这似乎有效。我只能推测 push() 需要很长时间才能弄清楚。顺便说一句,在我的 console.log 中,我还检查了 globalArray.length。令人惊讶的是,它似乎跟不上我没有使用的 globalArrayIndex 方法。我猜 .length 真的很慢,所以很多快速的连续 done() 调用导致了这个问题。

    var globalArray = [];
    var globalArrayIndex = 0;
    
    for (var i = 0; i < URLList.length; i++)
        {
            (function (i) {
                $.ajax(
                {
                    url: URLList[i],
                    cache: false
                }).done(function(html)
                {
                    if (html.indexOf('someString') != -1)
                    {
                        globalArray[globalArrayIndex] = (URLList[i]);
                        globalArrayIndex++;
                    }
                });
            })(i);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2020-06-05
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      相关资源
      最近更新 更多